POJ-1144-Network

来源:互联网 发布:蜂窝移动网络走流量吗 编辑:程序博客网 时间:2024/05/17 09:04

       这个题是个模板题吧,就是求割点的个数,直接代码吧。

代码:

#include<cstdio>#include<cstring>#include<iostream>#define MAX 2001using namespace std;int n,e,t,root,pnt[MAX],head[MAX],nxt[MAX],vis[MAX],cut[MAX],dfn[MAX],low[MAX];void add(int u,int v){    pnt[e]=v,nxt[e]=head[u],head[u]=e++;}void dfs(int u,int fa){    int v,cnt=0,flag=1;    vis[u]=1;    dfn[u]=low[u]=++t;    for(int i=head[u];i!=-1;i=nxt[i])    {v=pnt[i];if(v==fa&&flag){    flag=0;    continue;}if(!vis[v]){    dfs(v,u);    cnt++;    low[u]=min(low[u],low[v]);    if((u==root&&cnt>1)||(u!=root&&low[v]>=dfn[u]))cut[u]=1;}else if(vis[v]==1)    low[u]=min(low[u],dfn[v]);    }    vis[u]=2;}int main(){    int n;    while(scanf("%d",&n)&&n)    {t=e=0;root=1;memset(head,-1,sizeof(head));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(vis,0,sizeof(vis));memset(cut,0,sizeof(cut));int m;while(scanf("%d",&m)&&m){    while(getchar()!='\n')    {int ita;scanf("%d",&ita);add(m,ita);add(ita,m);    }}dfs(1,-1);int ans=0;for(int i=1;i<=n;i++)    if(cut[i])ans++;printf("%d\n",ans);    }    return 0;}