从没有入的点开始找就完了,找完入得点,删除他出的点的入度,不断找0 不断输出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define V 510 //最大顶点数
int G[V][V]; //图
int degree[V]; //记录各顶点的入度
void topological_sort(int n) //拓扑排序函数
{
int i, j, k;
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++){
if(degree[j] == 0){ //找到入度为0的顶点
printf("%d", j); //输出
degree[j]--; //将其入度减为-1
k = j; //用k记录此顶点
break;
}
}
for(j = 1; j <= n; j++){
if(G[k][j] == 1){
G[k][j] = 0; //标记
degree[j]--; //将找到的顶点的入度减一
}
}
if(i != n)
printf(" ");
else
printf("\n");
}
}
int main(void)
{
int n; //队伍的个数
int m; //每组数据后接的输入行数
while(scanf("%d%d", &n, &m) != EOF){
memset(G, 0, sizeof(G)); //图的初始化
memset(degree, 0, sizeof(degree)); //顶点入度的初始化
while(m--){
int u, v;
scanf("%d%d", &u, &v);
if(G[u][v] == 0){
G[u][v] = 1;
degree[v]++; //顶点v的入度加一
}
}
topological_sort(n); //调用拓扑排序函数
}
return 0;
}