套模板。不过用map < int,int > 错了,换成set < pair < int,int > > 结果就对了。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10010;
const int MAXM = 100100;
struct Edge
{
int to,next;
};
Edge edge[MAXM];
int Low[MAXN],DFN[MAXN];
int head[MAXN];
int tot,Index,cnt;
set<pair<int,int>> res;
void init()
{
memset(head,-1,sizeof(head));
res.clear();
tot = 0;
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Tarjan(int u, int pre)
{
DFN[u] = Low[u] = ++Index;
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if(!DFN[v])
{
Tarjan(v,u);
Low[u] = min(Low[u],Low[v]);
if(Low[v] > DFN[u])
{
++cnt;
res.insert(make_pair(min(u,v),max(u,v)));
}
}
else if(v != pre)
Low[u] = min(Low[u],DFN[v]);
}
}
void solve(int n)
{
memset(Low,0,sizeof(Low));
memset(DFN,0,sizeof(DFN));
Index = cnt = 0;
for(int i = 1; i <= n; ++i)
if(!DFN[i])
Tarjan(i,i);
printf("%d critical links\n",cnt);
for(pair<int,int> x : res)
printf("%d - %d\n",x.first-1,x.second-1);
printf("\n");
}
int main()
{
int n;
while(~scanf("%d",&n))
{
init();
int u,v,k;
for(int i = 0; i < n; ++i)
{
scanf("%d (%d)",&u,&k);
u++;
while(k--)
{
scanf("%d",&v);
v++;
addedge(u,v);
addedge(v,u);
}
}
solve(n);
}
return 0;
}