LightOJ 1026 Critical Links[求割边]

题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1026

题目大意:

给出一个无向图(不一定连通),求割边。

解题思路:

求割边的方法跟求强连通分量类似都是通过DFS来实现的。记录dfn[u],low[u]为u第一次访问的时间、可达到的最早的结点。dfs的过程中,对于边u->v,如果low[v]>dfn[u]那么u->v是割边,因为v到达的最早的结点也在u点之后,所以去掉u->v这条边后,u和它之前的点就不可达v了。

代码:

#include
#include
#include
#include
using namespace std;
pairside[200001];
int low[10001],dfn[10001],isbridge[200001],t,node[10001],top,cnt;
pairans[200001];
int n,m,ans_top;
void dfs(int u,int fa){
	low[u]=dfn[u]=t++;
	int v;
	for(int i=node[u];i!=-1;i=side[i].second){
		v=side[i].first;
		if(!dfn[v]){
			dfs(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u]){
				isbridge[i]=true;
				cnt++;
			}
		}else if(dfn[v]



你可能感兴趣的:(ACM-图论)