题目大意:让你求割桥数目
直接套模板,注意:u要大于v
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int mx = 100005;
vector<int>G[mx];
struct bri{
int l,r;
bool operator<(bri a)const{
if(l != a.l) return l < a.l;
return r < a.r;
}
}b[mx];
int pre[mx],low[mx],dfn,n,cnt;
void init(){
for(int i = 0; i < n; i++)
G[i].clear();
memset(pre,0,sizeof(pre));
memset(low,0,sizeof(low));
cnt = dfn = 0;
}
void dfs(int u,int fa){
low[u] = pre[u] = ++dfn;
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i];
if(!pre[v]){
dfs(v,u);
low[u] = min(low[u],low[v]);
if(pre[u] < low[v]){ //判断v是否能返回到u或u以上的点
b[cnt].l = u;
b[cnt++].r = v;
}
}
else if(v != fa)
low[u] = min(low[v],low[u]);
}
}
void solve(){
for(int u = 0; u < n; u++)
if(!pre[u])
dfs(u,-1);
for(int i = 0; i < cnt; i++)
if(b[i].l > b[i].r)
swap(b[i].l,b[i].r);
sort(b,b+cnt);
printf("%d critical links\n",cnt);
for(int i = 0; i < cnt; i++)
printf("%d - %d\n",b[i].l,b[i].r);
printf("\n");
}
int main(){
while(scanf("%d",&n)!=EOF){
if(!n){
printf("0 critical links\n\n");
continue;
}
init();
for(int i = 1; i <= n; i++){
int u,m,v;
scanf("%d (%d)",&u,&m);
for(int j = 1; j <= m; j++){
scanf("%d",&v);
G[u].push_back(v);
}
}
solve();
}
return 0;
}