Pagini recente » Cod sursa (job #1973563) | Cod sursa (job #2534164) | Cod sursa (job #1539811) | Cod sursa (job #582516) | Cod sursa (job #3157167)
///df.ex1 - cate comp conexe sunt; cu liste si cu dfs
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int nmax=100000;
vector<int> G[nmax+1]; ///g[i] = lista nodurilor cu care are muchie i
int vis[nmax+1]; ///vis [i] = 0, nod nevizitat; 1 = nod vizitat pt DFS
void dfs(int x)
{
vis[x]=1; //se marcheaza ca fiind vizitat
for(auto next: G[x]) //se parcurge lista de adiacenta a nodului x pt a-i gasi vecinii
{
if(!vis[next]) //daca e vecin nevizitat e urmatorul pe care se aplica DFS
dfs(next);
}
}
int main()
{
ifstream f("dfs.in");
ofstream g("dfs.out");
int n,m; /// n= nr noduri, m = nr muchii
f>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
f>>x>>y;
G[x].push_back(y); //adaugam in lista de adiacenta a lui x: nodul y
G[y].push_back(x); //adaugam si in lista lui y: nodul x (e graf neorientat)
}
int cnt=0; //nr de comp conexe
for(int i=1;i<=n;i++)
{
if(!vis[i]) //in momentul in care dai de un nod care nu a fost vizitat inseamna ca dai de o componenta conexa noua( pe parcursul alg de DFS se
//marcheaza ca fiind vizitate nodurile din aceeasi comp conexa cu cel gasit nevizitat
{
cnt++; //crestem nr de comp conexe
dfs(i); //pornim parcurgerea dfs pt a gasi toata componenta conexa si sa avem toate nodurile din componenta marcate ca fiind vizitate
}
}
g<<cnt;
}