Codeforces Round #656 (Div. 3) E. Directing Edges
题目链接:https://codeforces.com/contest/1385/problem/E
题意
$n$ 个结点之间有 $m$ 条边,其中有无向边和有向边,判断能否通过指定无向边的方向构造出有向无环图。
题解
如果原图开始就有有向环则无解。否则,可以通过拓扑排序来避免形成环。
代码
#include <bits/stdc++.h> using namespace std; void solve() { int n, m; cin >> n >> m; vector<int> G[n]; int deg[n] = {}, pos[n] = {}; vector<pair<int, int>> edges; for (int i = 0; i < m; i++) { int f, u, v; cin >> f >> u >> v; --u, --v; if (f == 1) { G[u].push_back(v); ++deg[v]; } edges.emplace_back(u, v); } queue<int> que; for (int i = 0; i < n; i++) { if (deg[i] == 0) { que.push(i); } } int cnt = 0; while (!que.empty()) { int u = que.front(); que.pop(); pos[u] = cnt++; for (auto v : G[u]) { if (--deg[v] == 0) { que.push(v); } } } if (cnt != n) { cout << "NO" << "\n"; } else { cout << "YES" << "\n"; for (auto [u, v] : edges) { if (pos[u] > pos[v]) { swap(u, v); } cout << u + 1 << ' ' << v + 1 << "\n"; } } } int main() { int t; cin >> t; while (t--) solve(); }

浙公网安备 33010602011771号