求割点

来源:互联网 发布:淘宝客如何做免单活动 编辑:程序博客网 时间:2024/06/06 18:19
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int M=10000;struct node{    int to,next;}e[M];int dfn[110],low[110];int head[110],vis[110];int cnt[110];int m,ci,root;void add(int u,int v)//链式前向星{    e[ci].to=v;    e[ci].next=head[u];    head[u]=ci++;}void dfs(int u,int father,int a){    int son=0;    vis[u]=1;    dfn[u]=low[u]=a;    for(int i=head[u];i!=-1;i=e[i].next)    {        int v=e[i].to;        if(vis[v]==1&&v!=father)            low[u]=min(low[u],dfn[v]);        if(vis[v]==0)        {            dfs(v,u,a+1);            son++;            low[u]=min(low[u],low[v]);            if((u==root&&son>1)||(u!=root&&dfn[u]<=low[v]))                cnt[u]=1;        }    }    vis[u]=2;}int main(){    while(scanf("%d",&m),m)    {        memset(head,-1,sizeof(head));        memset(vis,0,sizeof(vis));        memset(low,0,sizeof(low));        memset(dfn,0,sizeof(dfn));        memset(cnt,0,sizeof(cnt));        int n;  ci=0;        while(scanf("%d",&n),n)        {            while(getchar()!='\n')            {                int a;                scanf("%d",&a);                add(a,n);                add(n,a);            }        }        root=1;        int sum=0;        dfs(1,-1,1);        for(int i=1;i<=m;i++)            if(cnt[i])            sum++;        printf("%d\n",sum);    }    return 0;}

原创粉丝点击