b_wy_奧運會真實排名(拓撲排序)
阿新 • • 發佈:2021-08-08
T組資料,每組資料表示有 m 個人給出自己看到的運動員的衝線排名,
問能不能通過每組資料中每個觀眾給出的排名算出運動員的真實排名,
能就輸出排名,否則輸出 NO
4
3 2
2 1 3
2 1 2
4 3
3 1 2 3
2 1 3
2 1 4
4 1
4 1 2 3 4
4 3
3 1 2 4
3 1 3 4
2 3 2
NO
NO
1 2 3 4
1 3 2 4
思路:...
#include<bits/stdc++.h> using namespace std; void f() { int n, m; cin >> n >> m; vector<int> in(n+1, 0); vector<int> g[n+1]; for (int i = 0; i < m; i++) { int c, pre = -1; cin >> c; while (c--) { int u; cin >> u; if (pre != -1) { g[pre].push_back(u); in[u]++; } pre = u; } } queue<int> q; for (int i = 1; i <= n; i++) { if (in[i] == 0) { q.push(i); } } vector<int> ans; while (!q.empty()) { if (q.size() != 1) { break; } int u = q.front(); ans.push_back(u), q.pop(); for (int v : g[u]) { if (--in[v] == 0) { q.push(v); } } } if (ans.size() == n) { for (int i = 0; i < ans.size(); i++) { cout << ans[i] << " \n"[i == n-1]; } } else { cout << "NO\n"; } } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t; cin >> t; while (t--) { f(); } return 0; }