1. 程式人生 > >圖的聯通塊劃分與大小

圖的聯通塊劃分與大小

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; }