有向图是否存在环的方法以?
时间:2011-09-14
来源:互联网
作者: goodluckhyp 发布时间: 2011-09-14
访问下一个节点时(不能等于pre),如果某个点已经访问过,那么形成了环。
作者: power721 发布时间: 2011-09-14
作者: goodluckhyp 发布时间: 2011-09-14
visit[i]=true;
(visit数组开始全部置为false)
然后dfs时如果访问已经标记的点,说明存在环
如果全部都标记后还没遇到已经标记的点,则没有
判断是否有环,也可以用并查集(我觉得实现很简单)
作者: nuptxxp 发布时间: 2011-09-14
作者: nuptxxp 发布时间: 2011-09-14
A[i][j]=1 表示顶点 i 到 j 有边;
A[i][j]=0 表示顶点 i 到 j 无边;
算法如下:
for (;;)
{
检查 A[1][1],A[2][2],...,A[n][n] 是否有 1,若有,返回 "有回路";若没有,继续;
Flag=0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (A[i][j]!=0) // 若 i 到 j 有一条边
for (k=1;k<=n;k++)
if (A[j][k]!=0) // 若 j 到 k 也有边
{
if (A[i][k]==0) Flag=1; // 发现新路
A[i][k]=1;
}
if (Flag==0) break; // 没有发现新路
}
返回 "没有回路"
作者: icessl 发布时间: 2011-09-14
// 返回 1 有回路
// 返回 0 没有回路
int HasCircle(int SrcDot,int Path[],int Deep)
{
int i;
for (i=1;i<=n;i++)
if (A[SrcDot][[i]!=0) // 若 SrcDot 到 i 有边
{
if (i==SrcDot || 在 Path[0],Path[1],...,Path[Deep-1] 中有一个等于 i) return 1;
Path[Deep]=SrcDot;
if (HasCircle(i,Path,Deep+1)!=0) return 1;
}
return 0; // 没有回路
}
主调函数是:
int Path[N];
for (i=1;i<=n;i++)
{
if (HasCircle(i,Path,0)!=0) return 1; // 有回路
}
return 0;
作者: icessl 发布时间: 2011-09-14
作者: fairywell 发布时间: 2011-09-14
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28