原理:1:在有向图中选一个入度为零的顶点并输出。2:从图中删除该顶点和所有以它为尾的弧
重复上面二个步骤,直至全部的顶点都输出或者当前图中不存在入度为零的顶点为止,否则说明图中存在环。
#include "stdio.h"
#include "string.h"
#define VERTEX_NUM 30
int matrix[VERTEX_NUM][VERTEX_NUM];//邻接矩阵
int indegree[VERTEX_NUM];//记录每个顶点的入度
int topological_sort (int n) {//n顶点的个数
int stack[VERTEX_NUM];
int front = 0;
int i;
int count = 0;
for (i = 0;i < n;i++) {
if (indegree[i] == 0) {
stack[front++] = i;//入度为0的顶点进栈
}
}
while (0 != front) {
int v = stack[--front];
count++;
printf ("%d ",v+1);
for (i = 0;i < n;i++) {
if (1 == matrix[v][i]) {
indegree[i]--;
if (0 == indegree[i]) {
stack[front++] = i;
}
}
}
}
if (count < n) {
return -1;//存在环
}else {
return 1;
}
}
int main () {
int n;//顶点数
int m;//边数
int i;
memset (matrix,0,sizeof(matrix));
memset (indegree,0,sizeof(indegree));
scanf ("%d%d",&n,&m);
for (i = 0;i < m;i++) {
int v,u;
scanf ("%d%d",&v,&u);
if (matrix[v-1][u-1] == 0) {
indegree[u-1]++;
}
matrix[v-1][u-1] = 1;
}
i = topological_sort (n);
if (i == 1) {
printf ("YES");
}else {
printf ("NO");
}
return 0;
}
在无环的有向图中可以使用深度优先遍历进行拓扑排序。按照退出DFS函数的先后记录下来顶点的序列,即为逆向的拓扑有序序列。