Submission #1259088

#TimeUsernameProblemLanguageResultExecution timeMemory
1259088maxilOne-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; map<pair<int,int>, int> dir; // hướng của cạnh: (u,v) -> 1 nếu u->v, -1 nếu v->u bool assign_edge(int a, int b) { if (dir[{a,b}] == -1) return false; dir[{a,b}] = 1; dir[{b,a}] = -1; return true; } bool bfs_and_direct(int s, int t) { vector<int> parent(n+1, -1); queue<int> q; q.push(s); parent[s] = 0; while (!q.empty()) { int u = q.front(); q.pop(); if (u == t) break; for (int v : adj[u]) { if (parent[v] == -1) { parent[v] = u; q.push(v); } } } if (parent[t] == -1) return false; // không tìm được đường đi (không xảy ra nếu đồ thị liên thông) // đi ngược lại từ t -> s để định hướng các cạnh int cur = t; while (cur != s) { int par = parent[cur]; if (!assign_edge(par, cur)) return false; // mâu thuẫn cur = par; } return true; } 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(v); adj[v].push_back(u); dir[{u,v}] = dir[{v,u}] = 0; // chưa gán hướng } bool ok = true; for (int i = 0; i < p; i++) { int u, v; cin >> u >> v; if (!bfs_and_direct(u, v)) { ok = false; break; } } if (!ok) { cout << "NO\n"; return 0; } cout << "YES\n"; for (auto &e : edges) { if (dir[{e.u, e.v}] == 1) { cout << e.u << " " << e.v << "\n"; } else if (dir[{e.v, e.u}] == 1) { cout << e.v << " " << e.u << "\n"; } else { // nếu cạnh không bị ép hướng, ta in theo input cout << e.u << " " << e.v << "\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...