您的位置:首页 > 其它

判断无向图是否有环

2016-05-14 10:46 477 查看
无向图:

1 并查集



首先我们把每个点看成独立的集合{0} ,{1}, {2}, 然后规定如果两个点之间有边相连,如果这两个点不属于同一个集合,那就将他们所属的结合合并,看边0-1,直接将这两个点代表的集合合并{0, 1}, 其中让1来当父节点, 看边1-2, 它们分别属于不同的集合,合并集合之后是{1, 2},让2来当父节点,依照这种逻辑关系,0的祖先节点就是2, 然后在看边0-2,他们属于一个集合,因为他们有着共同的祖先2, 这就说明0-2之间在没有0-2这条边之前已经连通了,如果在加上这条边的话那从0到2就有两条路径可达,就说明存在一个环了.

int main(){
int n,m,f1,f2;
int pre[1000];
//每个点互相独立,自成一个集合,从1编号到1000的上级都是自己
for(i=1;i<=1000;++i){
pre[i]=i;
}
while(scanf("%d,%d",&m,&n)==2){ //m和n相连
f1=find(n);
f2=find(m);
if(f2==f1)
//两点已经连通了,那么这条路有一个环
else
unio(n,m);
}
return 0;
}
2 DFS

图只有树边和反向边,如果有反向边那么就有环,否则就是树或森林

bool dfs(int i,int pre)</span>{
visit[i]=true;
for(int j=1;j<=v;j++)
if(g[i][j])
{
if(!visit[j])
return dfs(j,i);
else if(j!=pre)  //如果访问过,且不是其父节点,那么就构成环
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: