下图说的很清楚,每次找入度为0的点,将其从序列中删掉,同时与它相连的所有点入度减一;
实现代码,以HUD_1285为例:
#include <iostream> #include <cstdio> using namespace std; const int N = 501; int map[N][N]; int into[N], ans[N]; void toposort(int x) { int i, j, k; for(i = 1; i <= x; i++) for(j = 1; j <= x; j++) if(map[i][j]) into[j]++; into[0] = 1; for(i = 1; i <= x; i++) { j = 0; while(into[j] != 0) { j++; if(j > x) return ; } ans[i] = j; into[j]--; for(k = 1; k <= x; k++) if(map[j][k]) into[k]--; } for(i = 1; i <= x; i++) { if(x != i) printf("%d ", ans[i]); else printf("%d\n", ans[i]); } } int main() { //freopen("data.in", "r", stdin); int n, m, i, a, b; while(~scanf("%d%d", &n, &m)) { for(i = 1; i <= m; i++) { scanf("%d%d", &a, &b); map[a][b] = 1; } topsort(n); } return 0; }