POJ1144-求图的割点(裸)

来源:互联网 发布:visual studio编程教材 编辑:程序博客网 时间:2024/04/30 15:00
#include <cstdio>#include <iostream>#include <vector>#include <cstring>using namespace std;const int NN=105;vector<int> adj[NN];int n,rt,rt_son;int dfn[NN],low[NN];bool cut[NN];void dfs(int u,int dep){    dfn[u]=low[u]=dep;    for (int i=0; i<adj[u].size(); i++)    {        int v=adj[u][i];        if (!dfn[v])        {            dfs(v,dep+1);            if (u==rt) rt_son++;            else            {                low[u]=min(low[u],low[v]);                if (low[v]>=dfn[u]) cut[u]=true;  //由后继节点搜不到比该点更早的点,则该点是割点            }        }        else low[u]=min(low[u],dfn[v]);    }}int main(){    while (scanf("%d",&n)!=EOF && n)    {        for (int i=1; i<=n; i++) adj[i].clear();        memset(dfn,0,sizeof(dfn));        int u,v;        while (scanf("%d",&u),u)        {            while (getchar()!='\n')            {                scanf("%d",&v);                adj[u].push_back(v);                adj[v].push_back(u);            }        }        rt=1; rt_son=0;        memset(cut,false,sizeof(cut));        dfs(rt,1);          if (rt_son>1) cut[rt]=true;   //有两个子树的根是割点        int sum=0;        for (int i=1; i<=n; i++) sum+=cut[i];        printf("%d\n",sum);    }    return 0;}


原创粉丝点击