割邊

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <stack>
using namespace std;
const int maxn=100020;
vector<int> g[maxn];
int n;
int low[maxn],dfn[maxn];
int d_cnt=0;
int num=0;
struct node
{
    int u,v;
}w[maxn];
bool cmp(struct node a,struct node b)
{
    if(a.u!=b.u) return a.u<b.u;
    return a.v<b.v;
}

void dfs(int u,int pre)
{
    low[u] = dfn[u] = ++d_cnt;
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==pre) continue;
        if(!dfn[v])
        {
            dfs(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])
            {
                if(u<v) { w[num].u=u ;w[num].v=v;}
                else  { w[num].v=u; w[num].u=v;   }
                num++;
            }
        }
        else  low[u]=min(low[u],dfn[v]);
    }

}
void tarjan()
{
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    d_cnt=0; num=0;
    for(int i=1;i<=n;++i)
    {
        if(!dfn[i]) dfs(i,i);
    }
    printf("%d critical links\n",num);
    sort(w,w+num,cmp);
    for(int i=0;i<num;++i)
    {
        printf("%d - %d\n",w[i].u-1,w[i].v-1);
    }
    printf("\n");
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;++i) g[i].clear();
        int u,k,v;

        for(int i=1;i<=n;++i)
        {
            scanf("%d (%d)",&u,&k);  u++;
            for(int j=1;j<=k;++j)
            {
                scanf("%d",&v); v++;
                if(u>=v) continue;
                g[u].push_back(v);
                g[v].push_back(u);
            }
        }
        tarjan();
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章