Submission #1259109

#TimeUsernameProblemLanguageResultExecution timeMemory
1259109maxilOne-Way Streets (CEOI17_oneway)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int u, v;
};

int n, m, p;
vector<Edge> edges;
vector<vector<int>> adj;
vector<pair<int,int>> queries;
vector<char> orient; // 'B', 'L', 'R'
bool possible = true;

// lưu hướng bị ép: 0 = chưa, 1 = u->v, 2 = v->u
vector<int> forced;

void force_edge(int id, int dir) {
    if (forced[id] == 0) forced[id] = dir;
    else if (forced[id] != dir) possible = false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m >> p;
    edges.resize(m);
    adj.assign(n+1, {});
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        edges[i] = {u, v};
        adj[u].push_back(i);
        adj[v].push_back(i);
    }
    queries.resize(p);
    for (int i = 0; i < p; i++) {
        cin >> queries[i].first >> queries[i].second;
    }

    orient.assign(m, 'B');
    forced.assign(m, 0);

    // xử lý từng truy vấn (sub2: p nhỏ nên BFS được)
    for (auto [s, t] : queries) {
        // BFS vô hướng
        vector<int> parent(n+1, -1);
        vector<int> pedge(n+1, -1);
        queue<int> q;
        q.push(s);
        parent[s] = s;
        while (!q.empty() && parent[t] == -1) {
            int u = q.front(); q.pop();
            for (int id : adj[u]) {
                int v = edges[id].u ^ edges[id].v ^ u; // lấy đỉnh kia
                if (parent[v] == -1) {
                    parent[v] = u;
                    pedge[v] = id;
                    q.push(v);
                }
            }
        }
        if (parent[t] == -1) {
            cout << "NIE\n";
            return 0;
        }

        // Truy ngược từ t về s để ép hướng cạnh
        int cur = t;
        while (cur != s) {
            int id = pedge[cur];
            int u = edges[id].u, v = edges[id].v;
            if (parent[cur] == u && cur == v) {
                // đi u->v
                force_edge(id, 1);
            } else if (parent[cur] == v && cur == u) {
                // đi v->u
                force_edge(id, 2);
            }
            cur = parent[cur];
        }

        if (!possible) {
            cout << "NIE\n";
            return 0;
        }
    }

    // in kết quả
    for (int i = 0; i < m; i++) {
        if (forced[i] == 1) orient[i] = 'R'; // u->v
        else if (forced[i] == 2) orient[i] = 'L'; // v->u
        else orient[i] = 'B';
    }
    for (char c : orient) cout << c;
    cout << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...