- 在图中找打入度为0的节点。
- 删除这个入度为0的点,更新所有节点的入度。
- 重复1/2步骤。直到输出所有节点。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[510][510];//存图
int in_dege[510];//入度个数
int m, n;
void topo_sort()
{
int i, j;
memset(in_dege, 0, sizeof(in_dege));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
in_dege[i] += map[j][i];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; in_dege[j] && j <= n; j++);
in_dege[j] = -1;
for (int k = 1; k <= n; k++)
{
in_dege[k] -= map[j][k];
}
if (i == 1)
{
printf("%d", j);
}
else
{
printf(" %d", j);
}
}
printf("\n");
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(map, 0, sizeof(map));
for (int i = 1; i <= m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
map[a][b] = 1;
}
topo_sort();
}
return 0;
}