提示:判别一个图是否有回路,可以有以下几种方法:
(1)利用深度优先遍历;
(2)拓扑排序。
设计步骤:
1.建立图
2.利用深度优先遍历来遍历查找
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define 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]);
printf(" %d", u);
}
void main()
{
int i, j;
printf("请输入图中的顶点个数:\n");
scanf("%d", &n);
memset(G, 0, sizeof(G));
printf("请输入一个%d*%d,矩阵(1表示存在弧,0表示不存在弧\n", n, n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &G[i][j]);
}
}
cycle = -1;
for (i = 0; i < n; i++)
{
if (!visited[i] && !DFS(i, -1))
{
break;
}
}
if (cycle < 0)
{
printf("不存在环!\n");
}
else
{
printf("存在环!");
DisPath(cycle);
printf("\n");
}
system("pause");
}
运行结果:
供个人使用。