Router Mesh
题目大意
跟 n 个点 m 条边,问你分别删除一个点后对应这 n 个点还有几个联通块。
解题思路
先求出来一共有多少个连通块,然后计算每个点对应到少个割边,之后连通块的个数加上该点的割边的数量就可以了。有个坑点就是,每次第一个遍历的点,他的割边的个数会多一,需要减一下;
代码
#include<bits/stdc++.h>
using namespace std;
const int mx=500100;
int f[mx];
int dfn[mx],low[mx];
int cnt=0;
vector<int>ve[mx];
void tarjan(int x,int fa){
if(dfn[x]) return ;
dfn[x]=low[x]= ++cnt;
for(int u:ve[x]){
if(u!=fa){
if(dfn[u]){
low[x]=min(low[x],dfn[u]);
continue;
}
tarjan(u,x);
if(dfn[x]<=low[u]){
f[x]++;
}
low[x]=min(low[x],low[u]);
}
}
if(fa==0) f[x]--;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0,x,y;i<m;i++){
cin>>x>>y;
ve[x].push_back(y);
ve[y].push_back(x);
}
int ans=0;
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i,0);
ans++;
}
}
for(int i=1;i<=n;i++){
cout<<ans+f[i]<<" ";
}
return 0;
}