1 条题解
-
0
不考虑优先限制的
#include <bits/stdc++.h> using namespace std; int n, m; vector<int> e[100000 + 5]; int d[100000 + 5]; queue<int> q; vector<int> ans; int main() { int t; cin >> t; while (t--) { cin >> n >> m; //-----清空 start----- for (int i = 1; i <= n; i++) { e[i].clear(); d[i] = 0; } ans.clear(); while (!q.empty()) q.pop(); //-----清空 end----- for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; e[u].push_back(v); d[v]++; } for (int i = 1; i <= n; i++) if (d[i] == 0) q.push(i); bool flag = false; // 多解标记 while (!q.empty()) { if (q.size() > 1) flag = true; int now = q.front(); q.pop(); ans.push_back(now); for (int i = 0; i < e[now].size(); i++) { int v = e[now][i]; d[v]--; if (d[v] == 0) q.push(v); } } if (ans.size() != n) { cout << "Impossible!\n"; } else { for (int i = 0; i < ans.size(); i++) cout << ans[i] << " "; cout << "\n"; } } return 0; }
满分
#include <bits/stdc++.h> using namespace std; int n, m; vector<int> e[100000 + 5]; int d[100000 + 5]; priority_queue<int> q; // ~~~ 反图的大的优 vector<int> ans; int main() { int t; cin >> t; while (t--) { cin >> n >> m; //-----清空 start----- for (int i = 1; i <= n; i++) { e[i].clear(); d[i] = 0; } ans.clear(); while (!q.empty()) q.pop(); //-----清空 end----- for (int i = 1; i <= m; i++) { int u, v; cin >> v >> u; // ~~~ 存反图 e[u].push_back(v); d[v]++; } for (int i = 1; i <= n; i++) if (d[i] == 0) q.push(i); bool flag = false; // 多解标记 while (!q.empty()) { if (q.size() > 1) flag = true; int now = q.top(); q.pop(); ans.push_back(now); for (int i = 0; i < e[now].size(); i++) { int v = e[now][i]; d[v]--; if (d[v] == 0) q.push(v); } } if (ans.size() != n) { cout << "Impossible!\n"; } else { //~~~ 原本顺序是反向的大的优先,所以要倒着输出 for (int i = (int)ans.size() - 1; i >= 0; i--) cout << ans[i] << " "; cout << "\n"; } } return 0; }
- 1
信息
- ID
- 4080
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 8
- 已通过
- 4
- 上传者