제출 #872592

#제출 시각아이디문제언어결과실행 시간메모리
872592vjudge1One-Way Streets (CEOI17_oneway)C++17
60 / 100
3008 ms27068 KiB
//author: Ahmet Alp Orakci #include <bits/stdc++.h> using namespace std; using i64 = long long; #define ONLINE_JUDGE void solve() { int n, m; cin >> n >> m; map <pair <int, int>, int> mp; vector <pair <int, int>> adj[n +1]; vector <pair <int, int>> edges(m); for(int i = 0; i < m; i++) { cin >> edges[i].first >> edges[i].second; adj[edges[i].first].emplace_back(edges[i].second, i); adj[edges[i].second].emplace_back(edges[i].first, i); mp[{min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second)}]++; } int timer = 0; vector <int> tin(n +1, -1), low(n +1, -1), is_bridge(m); function <void(int, int)> dfs = [&](int node, int par) -> void { low[node] = tin[node] = timer++; for(auto [child, number] : adj[node]) { if(child == par) { continue; } if(tin[child] == -1) { dfs(child, node); low[node] = min(low[node], low[child]); if(low[child] > tin[node]) { //cerr << node << " " << child << " :: " << number << "\n"; is_bridge[number] = true; } } else { low[node] = min(low[node], tin[child]); } } }; for(int i = 1; i <= n; i++) { if(tin[i] == -1) { dfs(i, -1); } } string res(m, 'B'); for(int i = 0; i < m; i++) { if(mp[{min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second)}] > 1) { //cerr << edges[i].first << " " << edges[i].second << " :: " << i << "\n"; is_bridge[i] = false; } if(is_bridge[i]) { res[i] = 'X'; } } //cerr << res << "\n"; vector <int> compo(n +1, -1); function <void(int, int)> dfsC = [&](int node, int color) { compo[node] = color; for(auto [child, num] : adj[node]) { if(compo[child] == -1 && !is_bridge[num]) { dfsC(child, color); } } }; int col = 0; for(int i = 1; i <= n; i++) { if(compo[i] == -1) { dfsC(i, col); col++; } } /* for(int i = 1; i <= n; i++) { cerr << compo[i] << " \n"[i == n]; } */ vector <pair <int, int>> nadj[col +1]; for(int i = 0; i < m; i++) { if(is_bridge[i]) { //cerr << i << " -> " << edges[i].first << " " << edges[i].second << " :: " << compo[edges[i].first] << " " << compo[edges[i].second] << "\n"; nadj[compo[edges[i].first]].emplace_back(compo[edges[i].second], i); nadj[compo[edges[i].second]].emplace_back(compo[edges[i].first], i); } } vector <int> boya(m +1); function <bool(int, int, int)> DFS = [&](int node, int par, int ulas) -> bool { //cerr << node << " " << par << " " << ulas << "\n"; if(node == ulas) { return true; } for(auto [child, num] : nadj[node]) { if(child == par) continue; if(DFS(child, node, ulas)) { if(compo[edges[num].first] == node) { boya[num] = 1; } else { boya[num] = 2; } return true; } } return false; }; int p; cin >> p; for(int i = 1; i <= p; i++) { int a, b; cin >> a >> b; //cerr << a << " " << b << " :: " << compo[a] << " " << compo[b] << "\n"; DFS(compo[a], -1, compo[b]); } for(int i = 0; i < m; i++) { if(boya[i] == 1) { assert(res[i] == 'X'); res[i] = 'R'; } else if(boya[i] == 2) { assert(res[i] == 'X'); res[i] = 'L'; } } for(int i = 0; i < m; i++) { if(res[i] == 'X') { res[i] = 'B'; } } cout << res; return; } signed main() { #ifndef ONLINE_JUDGE freopen(".in", "r", stdin); freopen(".out", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t = 1; //cin >> t; for(int i = 1; i <= t; i++) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...