POJ 1523 SPF (割点)

来源:互联网 发布:局域网未识别的网络 编辑:程序博客网 时间:2024/05/15 11:01

题目来源:http://poj.org/problem?id=1523

判断割点算法详见博客:http://blog.csdn.net/moon_sky1999/article/details/78169738

统计图中割点能够将图分割成的联通块的个数,也就是在处理节点cur的时候,统计其无法连回cur上面的节点的子树的个数。

代码:

#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxn=1e3+10;int n=0;vector<int> v[maxn];int dfn[maxn];int low[maxn];bool cut[maxn];int vis[maxn];int tot[maxn];void cut_bridge(int cur,int fa,int dep){vis[cur]=1;tot[cur]++;dfn[cur]=low[cur]=dep;int children=0;for(int i=0;i<v[cur].size();i++){int x=v[cur][i];if(vis[x]==1&&x!=fa){if(dfn[x]<low[cur])low[cur]=dfn[x];}if(vis[x]==0){cut_bridge(x,cur,dep+1);children++;if(low[x]<low[cur])low[cur]=low[x];if((fa==-1&&children>1)||(fa!=-1&&low[x]>=dfn[cur])){cut[cur]=1;tot[cur]++;}}}vis[cur]=2;}int main(){ios::sync_with_stdio(0);cin.tie(0);int x,y;cin>>x;int sce=0;while(x){sce++;n=0;memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(tot,0,sizeof(tot));memset(cut,0,sizeof(cut));memset(vis,0,sizeof(vis));for(int i=0;i<maxn;i++)v[i].clear();while(x){cin>>y;n=max(n,x);n=max(n,y);v[x].push_back(y);v[y].push_back(x);cin>>x;}for(int i=1;i<=n;i++){if(vis[i]==0){cut_bridge(i,-1,0);}}int num=0;for(int i=1;i<=n;i++)if(cut[i])num++;cout<<"Network #"<<sce<<endl;if(num==0)cout<<"  No SPF nodes"<<endl;else{for(int i=1;i<=n;i++){if(cut[i]){cout<<"  SPF node "<<i<<" leaves "<<tot[i]<<" subnets"<<endl;}}}cout<<endl;cin>>x;}return 0;}


原创粉丝点击