无向图找桥

无向图找桥

	int bridge,edge[v][v],ans[v],prve[v],vis[v];

// vis[i] 0为尚未访问 1为正在访问 2已经访问
//ans[i] 该点能到达的最小序号
// pre[i] 该点的序号

void dfs(int cur,int father,int dep,int n)
{
	if(bridge) // 已经找到桥
		return ;
	vis[cur] = 1;
	pre[cur] = ans[cur] = dep;
	for(int i=0;i<n;i++)
	{
		if(edge[cur][i])//有一条边cur到i
		{
			if(i!=father && 1 == vis[i])
			{
				if(pre[i]<ans[cur])
				{
					ans[cur] = pre[i];//是一条回边
				}
			}
		}
		if(0==vis[i]) 是一条树边
		{
			dfs(i,cur,dep+1,n);
			if(bridge) return ;
			if(ans[i]<ans[cur])
				ans[cur]= ans[i];//更新该点能到达的最小值
			if(ans[i]>pre[cur])
			{
				bridge = 1;
				return ;
			}
		}
	}
	vis[cur] =2;
}

  

posted @ 2014-03-04 18:44  哥的笑百度不到  阅读(396)  评论(0编辑  收藏  举报