题目描述
题目:
HDOJ 3342
题目真啰嗦,实际上是判断一个有向图中是否存在环。
分析
应用拓扑排序,如果一个有向图可以顺利完成拓扑排序,其肯定不存在环;否则,该有向图肯定存在环。
陷阱:在输入数据的时候注意
数据可能会重复,因此要加一个判断
源代码
#include <stdio.h>
#include <string.h>
int nodeRelation[100][100];
int inDegree[100];
int topSort(int N);
int main()
{
int N, M;
int master, prentice;
int i;
int result;
scanf("%d%d", &N, &M);
while (N != 0)
{
memset(nodeRelation, 0, sizeof(nodeRelation));
memset(inDegree, 0, sizeof(inDegree));
for (i = 0; i < M; i ++)
{
scanf("%d%d", &master, &prentice);
//注意可能会有重复数据
if (nodeRelation[master][prentice] == 0)
{
nodeRelation[master][prentice] = 1;
inDegree[prentice] ++;
}
}
result = topSort(N);
if (result == 1)
printf("YES\n");
else
printf("NO\n");
scanf("%d%d", &N, &M);
}
return 0;
}
int topSort(int N)
{
int i, j, k;
for (i = 0; i < N; i ++)
{
for (j = 0; j < N; j ++)
{
if (inDegree[j] == 0)
{
inDegree[j] --;
for (k = 0; k < N; k ++)
{
if (nodeRelation[j][k] == 1)
inDegree[k] --;
}
break;
}
}
if (j == N)
return 0;
}
return 1;
}