#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;
}
割邊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.