假设以邻接矩阵作为图的结构,编写算法,判别在给定的有向图中是否存在一个简单的有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)(注意:图中不存在顶点到自身的弧)
这是清华大学的考研试题。为了判断有向图是否存在环,可以通过深度优先搜索的方法来实现。从编号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