POJ 1285 确定比赛名词 (拓扑排序)

    xiaoxiao2024-10-15  77

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct node { int to, next; }e[maxn << 1]; int head[maxn], in[maxn], n, m, cnt; void init() { memset(head, -1, sizeof(head)); memset(in, 0, sizeof(in)); memset(e, 0, sizeof(e)); cnt = 0; } void add (int from, int to) { e[++cnt].to = to; e[cnt].next = head[from]; head[from] = cnt; } void topsort() { priority_queue <int, vector <int>, greater <int> > q; vector <int> ans; for (int i = 1; i <= n; i++) { if (!in[i]) q.push(i); } while (!q.empty()) { int u = q.top(); q.pop(); ans.push_back(u); for (int i = head[u]; i != -1; i = e[i].next) { int v = e[i].to; in[v]--; if (!in[v]) q.push(v); } } for (int i = 0; i < ans.size() - 1; i++) cout << ans[i] << " "; cout << ans[ans.size() - 1] << endl; } int main() { while (cin >> n >> m) { init(); for (int i = 0; i < m; i++) { int ui, vi; cin >> ui >> vi; add (ui, vi); in[vi]++; } topsort(); } return 0; }

     

    拓扑排序模板题,注意多样例输出 和最后一个输出后面没有空格

    最新回复(0)