天天看點

圖深度優先搜尋之block的個數

#include <iostream>
#include <cstring>
using namespace std;

int path[1001][1001];
int visited[1001];
int n,m;


//将與x相連的節點都标記為已通路 
void dfs(int x){
	
	visited[x] = 1; //标記x已通路的位置要正确,要先處理x已通路,不然會漏了一種情況 
	 
	for(int i=1;i<=n;i++){
		if(!visited[i] && path[x][i] == 1){
			//visited[i] = 1;
			dfs(i);
		}
	}
}

int main(){
	
	memset(path,0,sizeof(path));
	memset(visited,0,sizeof(visited));
	
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		path[a][b] = 1;
		path[b][a] = 1;
	}
	
	int block = 0;
	
	//遇到未通路的節點,block就加一,然後将與該節點相連的所有節點都标記為通路過 
	//Attention!!!!!!!!一定要注意節點的下标是從1開始的!!!! 
	for(int i=1;i<=n;i++){
		if(visited[i] == 0){
			block++;
			dfs(i);
		}
	}
	cout<<block<<endl;
	return 0;
}