圖的聯通塊劃分與大小
阿新 • • 發佈:2018-11-21
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;
}