码迷,mamicode.com
首页 > 其他好文 > 详细

看数据结构写代码(44) 判断无向图是否有环路

时间:2015-04-13 16:48:02      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:判断无向图是否有环路   无向图是否有环问题   

在 看 严蔚敏的 数据结构 一书 7.5小节时,书上 说“ 判断有向图是否存在环要不无向图复杂。对于无向图来说,深度优先遍历过程中遇到回边(即指向已访问过的顶点的边),则必定存在环路”。 看的不明白,所以 网上 百度了一下。

有了思路:故写下算法 和思路,以便以后 温故。

思路:

1.一个n个顶点,e条边的 无向图,若 e>= n,必有环路

2.若 e < n ,需要 深度 遍历,并把 父节点传入 参数中,如果 遇到 一个 节点 被访问过 并且 不是 父节点,那么 就有环路

上代码:

void dfsCycle(Graph g,int curent,int parent,bool * isVisited,bool * is){
	isVisited[curent] = true;
	ArcNode * next = g.list[curent].head->nextArc;
	for (; next != NULL; next = next->nextArc)
	{
		int index = next->adjVex;
		if (isVisited[index] == false){
			dfsCycle(g,index,curent,isVisited,is);
		}
		else if(index != parent){
			*is = true;
		}
	}
}

bool isCycle(Graph g){
	if (g.arcNum >= g.vexNum){
		return true;
	}
	bool isVisited[MAX_VERTEX_NUM] = {false};
	bool is = false;
	for (int i = 0; i < g.vexNum; i++)
	{
		if (isVisited[i] == false){
			dfsCycle(g,i,-1,isVisited,&is);
			if (is){//存在环路,退出函数
				return true;
			}
		}
	}
	return is;
}


int _tmain(int argc, _TCHAR* argv[])
{
	Graph g;
	graphCreate(&g);
	printGrahp(g);
	char * is = isCycle(g) ? "有环路" : "没有环路";
	printf("图 %s\n",is);
	//及时销毁内存是个好习惯
	graphDestory(&g);
	return 0;
}
运行截图:

完整代码 网盘地址:点击打开链接


技术分享

看数据结构写代码(44) 判断无向图是否有环路

标签:判断无向图是否有环路   无向图是否有环问题   

原文地址:http://blog.csdn.net/fuming0210sc/article/details/45026021

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!