DFS, wyszukiwanie spójnych składowych w grafie.

0

Miałem problem, napisałem DFS(nie wiem czy dobrze), i chciałem zliczyć ilość spójnych składowych grafu. Na razie napisałem tylko takie coś gdzie: n to liczba węzłów, m to liczba krawędzi,
a to numer jednego węzła, b to numer drugiego z którym a jest połączony. Jak miasta drogą.

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

vector <int> s[100007];
bool vis[100007];

int n,m,a,b,wynik=0;
void DFS(int x)
{
    vis[x]=true;
    for(int i=0;i<(int)s[x].size();i++){
        int u=s[x][i];
        if(!vis[u]){
            DFS[u];
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i=0;i<m;i++){
        cin >> a >> b;
        s[a].push_back(b);
        s[b].push_back(a);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            DFS[i];
            wynik ++;
        }
    }
    cout << wynik;
    return 0;
}
0

@KomnatoMan: Fajnie, a jakie masz pytanie?

0

@Cepo: a tak, przepraszam.
Program nie działa jak powinien, więc prosze o zweryfikownie kodu w oparciu o zmienne które podałem (ja nie widze nic) i pomysły na to żeby zadziałał.

4

@KomnatoMan:

  1. Jak się wywołuje funkcję w c++?
  2. Jaki konstruktor ma std::vector?
  3. Co się dzieje, gdy zmienna nie jest zainicjalizowana?
  4. Co tu chciałeś osiągnąć? (int)s[x].size()
  5. Masz vector jednowymiarowy, a robisz na przykład takie coś: s[a].push_back(b), int u=s[x][i];

Widzę poważne braki w znajomości języka programowania, chyba zbyt trudny temat zacząłeś.

EDIT:
Dopiero teraz ogarnąłem, że robisz tam tablicę vectorów, bardzo dziwna konstrukcja.

0

@Cepo:

  1. Nie zauważyłem złego nawiasu.
  2. Nie wiem co to konstuktor.
  3. Kompilator zgłasza błąd
  4. Odtworzyć się tyle razy, ile jest połączeń między węzłąmi.
  5. Na kółku informatycznym tak pokazali, mój przyjaciel zrobił tak samo i mu działa.

EDIT:
Umieszczam w tablicy vectorów wszyskie połączone ze sobą węzły, co zmiejsza potrzebną pamięć.

0

@KomnatoMan:
Dbasz tak o pamięć i na pałę ustawiasz wielkość vectora na 100007?
Pokaż jak masz teraz zrobione i powiedź jaki problem się pojawia to będziemy dalej myśleć.

0

@Cepo: Tak, bo to jest do zadania, i tych węzłów może być do 100000, dla bezpieczeństwa dałem 100007.

a teraz tak to wygląda: dalej nie wiem o jaką zmienną ci chodziło.

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

vector <int> s[100007];
bool vis[100007];

int n,m,a,b,wynik;
void DFS(int x)
{
    vis[x]=true;
    for(int i=0;i<(int)s[x].size();i++){
        int u=s[x][i];
        if(!vis[u]){
            DFS[u];
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i=0;i<m;i++){
        cin >> a >> b;
        s[a].push_back(b);
        s[b].push_back(a);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            DFS(i);
            wynik ++;
        }
    }
    cout << wynik;
    return 0;
}
0

@Cepo: Poprawiłem tylko w mainie. Już jest poprawione w DFS.

Mam wszysktie zmienne zainicjować oddzielnie?, bo ja nie odwołuje sie do żadnej zmiennej która nie istnieje

0

A jesteś pewien ze vis jest poprawnie ustawione ? ;) dodaj na szybko static i porwanej wynik.

2
KomnatoMan napisał(a):

@Cepo: a tak, przepraszam.

Program nie działa jak powinien, więc prosze o zweryfikownie kodu w oparciu o zmienne które podałem (ja nie widze nic) i pomysły na to żeby zadziałał.

Co to znaczy program nie działa?

  • crash?
  • zła odpowiedź?
  • przekroczenie czasu?
  • nie kompiluje się?

A problemem jest durna literówka, którą psuje kod i kompilator wytyka, a nikt z poprzedników jej nie zauważył (cepo zauważył, ale też to opisał jeszcze bardziej enigmatycznie).
Reszta kodu jest Ok.

Literówka jest tak prosta, że nie będę jej wskazywał palcem :).
Jest: DFS[u] powinno być DFS(u).
https://godbolt.org/z/T3eE7csdr

1 użytkowników online, w tym zalogowanych: 0, gości: 1