給定一個有向無環圖 (DAG),節點代表參賽者,邊 u → v 表示 u 排名優於 v。輸出滿足所有約束的拓撲序列(若多解,輸出字典序最小/任意合法序列均可,本題無特殊要求)。
in[v]。u → v,in[v]--,若變 0 入隊。#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 505;
int mat[MAXN][MAXN], in[MAXN];
int n, m;
void topological_sort() {
int cnt = n;
while (cnt--) {
int u = 1;
while (u <= n && in[u] != 0) ++u; // 找入度為0的點
printf("%d", u);
in[u] = -1; // 標記已輸出
if (cnt) printf(" ");
for (int v = 1; v <= n; ++v)
if (mat[u][v]) in[v]--;
}
printf("\n");
}
int main() {
while (scanf("%d%d", &n, &m) == 2) {
memset(mat, 0, sizeof(mat));
memset(in, 0, sizeof(in));
for (int i = 0; i < m; ++i) {
int u, v; scanf("%d%d", &u, &v);
if (!mat[u][v]) { mat[u][v] = 1; in[v]++; }
}
topological_sort();
}
return 0;
}
將隊列改為 priority_queue<int, vector<int>, greater<int>>(小根堆),每次取最小可用節點。