比较水的一道拓扑排序题。 由于题目对输出结果的顺序有了要求:要求是最小字典序的答案,所以用bfs版本的拓扑排序算法比较容易实现。 #include<stdio.h> #include<string.h> const int maxn = 510; int g[maxn][maxn], in[maxn], topo[maxn]; bool vis[maxn]; int n, m, len; void read_graph() { memset(g, 0, sizeof(g)); memset(in, 0, sizeof(in)); int a, b; for(int i = 0; i < m; i++) { scanf("%d%d", &a, &b); if(!g[a][b]) {g[a][b] = 1; in[b]++; } } } void topo_sort() { memset(vis, false, sizeof(vis)); len = 1; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(!vis[j] && in[j] == 0) { vis[j] = true; topo[len++] = j; for(int k = 1; k <= n; k++) if(!vis[k] && g[j][k]) in[k]--; break; } } } for(int i = 1; i < n; i++) printf("%d ", topo[i]); printf("%d/n", topo[n]); } #define LOCAL int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif while(scanf("%d%d", &n, &m) == 2) { read_graph(); topo_sort(); } return 0; }