割点

来源:互联网 发布:breed mac地址修改 编辑:程序博客网 时间:2024/04/28 09:21
#include <iostream>#include <stdio.h>#include <algorithm>#include <queue>#include <string.h>#include <stack>#include <vector>using namespace std;const int maxn=110;int n;vector<int> g[110];int son=0,d_cnt=0;int cut[110];int low[110],dfn[110],vis[110];void dfs(int u){    low[u] = dfn[u] = ++d_cnt;    vis[u]=1;    for(int i=0;i<g[u].size();++i)    {        int v=g[u][i];        if(!vis[v])        {            dfs(v);            low[u]=min(low[u],low[v]);            if(low[v]>=dfn[u] && u!=1)            {                cut[u]++;            }            else if(u==1)            {                son++;            }        }        else low[u]=min(low[u],dfn[v]);    }}void tarjan(){    memset(low,0,sizeof(low));    memset(dfn,0,sizeof(dfn));    memset(cut,0,sizeof(cut));    memset(vis,0,sizeof(vis));    son=0; d_cnt=0;    dfs(1);    int ans=0;    for(int i=2;i<=n;++i) if(cut[i]) ans++;    if(son>=2) ans++;    printf("%d\n",ans);}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==0) break;        for(int i=1;i<=n;++i) g[i].clear();        int u,v;        while(scanf("%d",&u)!=EOF)        {            if(u==0) break;            while(getchar()!='\n')            {                scanf("%d",&v);                g[u].push_back(v);                g[v].push_back(u);            }        }        tarjan();    }    return 0;}

原创粉丝点击