#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> mp[10010];
int ans,low[130],dfn[130],vis[130],cnt;
struct node{
int x,y;
}a[130];
bool cmp(const node u,const node v){
if(u.x == v.x) return u.y < v.y;
else return u.x < v.x;
}
void Tarjan(int u,int fa){
low[u] = dfn[u] = ++cnt;
vis[u] = 1;
for( int i = 0; i < mp[u].size(); i++){
int v = mp[u][i];
if(!vis[v]){
Tarjan(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u]){
a[ans].x = u;
a[ans].y = v;
if(u > v) swap(a[ans].x,a[ans].y);
ans++;
}
}
else if(fa != v){
low[u] = min(low[u],dfn[v]);
}
}
}
int main(){
int n,u,v;
while(scanf("%d",&n) == 1 ){
cnt = ans = 0;
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
for( int i = 0; i < n; i++){
int n1;
scanf("%d (%d)",&u,&n1);
for( int j = 0; j < n1; j++){
scanf("%d",&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
}
for( int i = 0; i < n; i++){
if(!dfn[i]) Tarjan(i,-1);
}
sort(a,a+ans,cmp);
printf("%d critical links\n",ans);
for( int i = 0; i < ans; i++){
printf("%d - %d\n",a[i].x,a[i].y);
}
printf("\n");
for( int i = 0; i < n; i ++)
if(!mp[i].empty()) mp[i].clear();
}
return 0;
}
无向图求桥的个数(有重边)
最新推荐文章于 2023-12-02 16:06:51 发布