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();
}

 

posted @ 2020-07-19 17:10  Kanoon  阅读(124)  评论(0)    收藏  举报