图5——判断有向图中是否存在回路

假设以邻接矩阵作为图的结构,编写算法,判别在给定的有向图中是否存在一个简单的有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)(注意:图中不存在顶点到自身的弧)

这是清华大学的考研试题。为了判断有向图是否存在环,可以通过深度优先搜索的方法来实现。从编号0的顶点出发,若两个顶点间存在路径,则记录下源顶点标记为已访问(标记为-1)。在遍历的过程中,若有顶点与源顶点相同,则说明存在环。

code:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;
const int N = 100;
int G[N][N];
int path[N], visited[N], n, cycle;
int DFS(int u, int start)
{
	int i;
	visited[u] = -1;
	path[u] = start;
	for (i = 0; i < n;i++)
	{
		if (G[u][i]&&i!=start)
		{
			if (visited[i]<0)
			{
				cycle = u;
				return 0;

			}
			if (!DFS(i,u))
			{
				return 0;
			}
		}
	}
	visited[u] = 1;
	return 1;
}

void DisPath(int u)
{
	if (u<0)
	{
		return;
	}
	DisPath(path[u]);
	cout << " " << u;

}

void main()
{
	int i, j;
	cout << "请输入图中的顶点个数:" << endl;
	cin >> n;
	memset(G, 0, sizeof(G));
	cout << "请输入一个" << n << "*" << n << "矩阵(1表示存在弧,0表示不存在弧):" << endl;
	for (i = 0; i < n;i++)
	{
		for (j = 0; j < n;j++)
		{
			cin >> G[i][j];
		}
	}
	cycle = -1;
	for (i = 0; i < n;i++)
	{
		if (!visited[i]&&!DFS(i,-1))
		{
			break;

		}
	}
	if (cycle<0)
	{
		cout << "不存在环!" << endl;
	} 
	else
	{
		cout << "存在环!" << endl;
		DisPath(cycle);
		cout << endl;
	}

	system("pause");
}

结果:

该算法创建4x4矩阵对应的有向图如下图所示


其中,a,b,c,d分别对应的编号为0,1,2,3,有向图有5条弧:<a,b> ,<a,c>,<b,c>,<b,d>和<d,a>,因此存在环a->b->d->a

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值