#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; }
无向图求桥的个数(有重边)
猜你喜欢
转载自blog.csdn.net/sky_zdk/article/details/79618183
今日推荐
周排行