您的位置:首页 > 其它

poj1523赤裸裸的割点

2015-04-14 21:57 253 查看
这题真是没什么好说的。。。赤裸裸的求割点直接模板上

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define maxn 1100

using namespace std;

vector<int> g[maxn];
int dfn[maxn],low[maxn];
int vis[maxn],cnt[maxn];
int k=1,f=0,index=0,m;
void dfs(int x)
{
//   cout<<"1"<<endl;
int c=0;
for(int i=0;i<g[x].size();i++)
{
int e=g[x][i];
if(vis[e]==0)
{
dfn[e]=low[e]=++index;
vis[e]=1;
dfs(e);
low[x]=min(low[e],low[x]);
if(low[e]>=dfn[x])
{
cnt[x]++;
}
}
else low[x]=min(low[x],dfn[e]);
}
}
void solve()
{
f=index=0;
memset(dfn,0,sizeof(dfn));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
memset(low,0,sizeof(low));
printf("Network #%d\n",k++);
vis[1]=1;
dfn[1]=low[1]=++index;
dfs(1);
if(cnt[1]>=1) cnt[1]--;
for(int i=1;i<=m;i++)
{
if(cnt[i])
{
printf("  SPF node %d leaves %d subnets\n",i,cnt[i]+1);
f=1;
}
}
if(f==0) printf("  No SPF nodes\n");
printf("\n");
}
int main()
{
int a,b;
while(scanf("%d",&a)!=EOF)
{
for(int i=1;i<=maxn;i++)
g[i].clear();
if(a==0) break;
scanf("%d",&b);
g[a].push_back(b);
g[b].push_back(a);
m=a<b?b:a;
while(1)
{
int x,y;
scanf("%d",&x);
if(x==0) break;
scanf("%d",&y);
g[x].push_back(y);
g[y].push_back(x);
m=m>x?m:x;
m=m>y?m:y;
}
solve();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: