割边

来源:互联网 发布:breed mac地址修改 编辑:程序博客网 时间:2024/05/01 09:05
#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;}