Cod sursa(job #1754633)

Utilizator bogdanluncasubogdan bogdanluncasu Data 8 septembrie 2016 15:02:50
Problema Parcurgere DFS - componente conexe Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<iostream>
#include<list>
#include<queue>
#include<algorithm>
using namespace std;
int n,m;
list<int> a[100001];
list<int> nodes;
int viz[100001];
queue<int> q;
int main(){
	freopen("dfs.in", "r", stdin);
	freopen("dfs.out", "w", stdout);
	int n1,n2;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
    	scanf("%d %d",&n1,&n2);
    	a[n1].push_back(n2);
    	a[n2].push_back(n1);
    }
	for(int i=1;i<=n;i++){
		if(a[i].size()!=0)
			nodes.push_back(i);
    }
	if(nodes.size()==0){printf("0");}
	else{
		q.push(*next(nodes.begin(),0));
		int c=n-nodes.size();
		while(q.size()!=0){
			int p=q.front();
			q.pop();
			if(!viz[p]){
				nodes.remove(p);
				viz[p]=1;
				for(list<int>::iterator it=a[p].begin();it!=a[p].end();){
					q.push(*it);
					a[*it].remove(p);
					a[p].erase(it++);				
				}
			}
			if(q.size()==0){
				c++;
				if(nodes.size()!=0)q.push(*next(nodes.begin(),0));
			}
		}
		printf("%d",c);
	}
}