题意:给出n个点,m条无向边,按顺序输出桥
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <climits>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
const int N=1e4+10;
struct Edge
{
int v,flag,next;
}edge[N*20];
struct bridge
{
int u,v;
}ans[N];
int s[N],tot,cnt;
int n,m;
int dfn[N],low[N],dep;
bool vis[N];
bool cmp(bridge a,bridge b)
{
if(a.u!=b.u) return a.u<b.u;
else return a.v<b.v;
}
void AddEdge(int u,int v)
{
for(int i=s[u]; ~i; i=edge[i].next)
{
if(edge[i].v==v)
{
edge[i].flag++;
return ;
}
}
edge[tot].v=v;
edge[tot].next=s[u];
edge[tot].flag=0;
s[u]=tot++;
}
void tarjan(int u,int pre)
{
vis[u]=true;
dfn[u]=low[u]=++dep;
for(int i=s[u]; ~i; i=edge[i].next)
{
int v=edge[i].v;
if(v==pre) continue;
if(!vis[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else low[u]=min(low[u],dfn[v]);
if((low[v]>dfn[u])&&!edge[i].flag)
{
ans[cnt].u=u;
ans[cnt].v=v;
if(u>v) swap(ans[cnt].u,ans[cnt].v);
cnt++;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(s,-1,sizeof s);
tot=cnt=0;
for(int i=1; i<=n; i++)
{
int u,v,k;
scanf("%d (%d)",&u,&k);
u++;
for(int j=1; j<=k; j++)
{
scanf("%d",&v);
v++;
AddEdge(u,v);
}
}
memset(vis,0,sizeof(vis));
dep=0;
for (int i=1;i<=n;i++)
if(!vis[i]) tarjan(i,i);
sort(ans,ans+cnt,cmp);
printf("%d critical links\n",cnt);
for(int i=0; i<cnt; i++)
printf("%d - %d\n",ans[i].u-1,ans[i].v-1);
printf("\n");
}
return 0;
}