圖的聯通塊劃分與大小

向前走別回頭發表於2018-11-07

vis陣列記錄某個點屬於哪一個聯通塊,在main(外部)中搜尋一個新的聯通塊

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6+5;
int n,m;
int nxt[maxn],head[maxn],ver[maxn],tot;
bool vis[maxn];
int cnt;
int size[maxn];
void add(int x, int y){
	ver[++tot]=y, nxt[tot]=head[x], head[x]=tot;
}
// 圖的聯通塊劃分 
void dfs(int x){
	vis[x]=cnt;  // x屬於cnt這個聯通塊 
	size[cnt]++; // x所屬聯通塊的大小 
	for(int i=head[x]; i; i=head[i]){
		int y=ver[i];
		if(vis[y])continue;
		dfs(y);
	}
}
int main(){
	cin>>n>>m;
	int x,y;
	for(int i=1; i<=m; ++i){
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			cnt++; // 聯通塊編號 
			dfs(i);
		}
	}
	for(int i=1; i<=n; ++i)cout<<size[vis[i]]<<endl; 
}

相關文章