POJ 1144 Network (Tarjan求割点)

来源:互联网 发布:亿程旅行社 知乎 编辑:程序博客网 时间:2024/06/05 17:16

http://poj.org/problem?id=1144

题意:求割点的个数。
裸模板。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 110;int dfn[N],low[N];bool cut[N];int rt ,rt_num,dep;vector<int> vet[N];void dfs(int u){    dfn[u] = low[u] = ++dep;    for(int i=0; i<vet[u].size();i++)    {        int v = vet[u][i];        if(!dfn[v])        {            dfs(v);            if(u==rt) rt_num++;            else            {                low[u] = min(low[u],low[v]);                if(low[v] >= dfn[u]) cut[u] = true;            }        }        else low[u] = min(low[u],dfn[v]);    }    return;}int main(){    //freopen("data.in","r",stdin);    int n;    while(scanf("%d",&n)!=EOF && n)    {        for(int i=1;i<=n;i++)  vet[i].clear();        int x,y; char ch;        while(scanf("%d",&x)!=EOF && x)        {            while(scanf("%d%c",&y,&ch)!=EOF)            {                vet[x].push_back(y);                vet[y].push_back(x);                if(ch=='\n')                    break;            }        }        rt = 1, rt_num = 0;        memset(dfn,0,sizeof(dfn));        memset(cut,false,sizeof(cut));        dfs(1);        int ans = 0;        dep = 0;        if(rt_num>1) cut[rt]=true;        for(int i=1;i<=n;i++)            if(cut[i]) ans++;        cout<<ans<<endl;    }    return 0;}
0 0
原创粉丝点击