UVA 796 Critical Links 【传送门】
求桥,套用Tarjan模板:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define lowbit(x) (x&-x)
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
#define INF 999999
#define MAXN 105
struct edge{
int from,to;
//int val; //如果有权值可以添加
};
vector<int> G[MAXN];
int dfn[MAXN],low[MAXN];
bool instack[MAXN];
edge qiao[MAXN];
int top=0;
int timing; //时间戳
int cnt; //scc个数
int V,E;
void init()
{
for(int i=0;i<=V;i++)
G[i].clear();
mem(dfn,0);
mem(instack,false);
mem(low,0);
timing=cnt=top=0;
}
//割边
void addpath(int a,int b){
qiao[top].from=min(a,b);
qiao[top++].to=max(a,b);
// qiao.insert(e);
}
void tarjan_Edge(int u,int fa) {
// int rc=0;//记录根节点的子节点个数
dfn[u]=low[u]=++timing;
for(int i=0; i<G[u].size(); i++) {
int v=G[u][i];
if(v==fa)
continue;
if(!dfn[v]) {
tarjan_Edge(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
addpath(u,v);
}
else if(fa!=u){
low[u]=min(low[u],dfn[v]);
}
}
}
bool cmp(edge a,edge b){
if(a.from==b.from) return a.to<b.to;
return a.from<b.from;
}
int main()
{
while(~scanf("%d",&V))
{
init();
for(int i=0;i<V;i++)
{
int a,b,n;
scanf("%d (%d)",&a,&n);
for(int i=0;i<n;i++){
scanf("%d",&b);
G[a].push_back(b);
G[b].push_back(a);
}
}
for(int i=0;i<V;i++)
if(dfn[i]==0)
tarjan_Edge(i,i);
sort(qiao,qiao+top,cmp);
printf("%d critical links\n",top);
for(int i=0;i<top;i++){
printf("%d - %d\n",qiao[i].from,qiao[i].to);
}
printf("\n");
}
return 0;
}