无向图求桥的个数(有重边)

#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