# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
597870 | 2022-07-17T03:10:18 Z | yanndev | Simurgh (IOI17_simurgh) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> const int IDK = 0; const int NOT_ROYAL = 1; const int ROYAL = 2; vector<pair<int, int>> graph[542]; vector<int> back[542]; bool vis[542]; bool dfsTree[4242]; int status[4242]; void dfs(int node, int root, int subId = -1) { vis[node] = true; for (auto& x: graph[node]) { if (vis[x.fi] && x.fi == root) back[subId].push_back(x.se); int nxtId = subId; if (subId == -1) nxtId = x.fi; dfsTree[x.se] = true; dfs(x.fi, root, nxtId); } } vector<int> find_roads(int n, vector<int> u, vector<int> v) { int m = (int)u.size(); for (int i = 0; i < m; i++) { graph[u[i]].push_back({v[i], i}); graph[v[i]].push_back({u[i], i}); } for (int i = 0; i < n; i++) { memset(vis, false, sizeof(vis)); memset(dfsTree, false, sizeof(vis)); for (int j = 0; j < n; j++) back[j].clear(); dfs(i, i, -1); for (auto& x: graph[i]) { // x.se a royal edge ??? if (status[x.se] != IDK) continue; vector<int> toQ {}; for (int j = 0; j < m; j++) if (dfsTree[j] && j != x.se) toQ.push_back(j); toQ.push_back(x.se); int orig = count_common_roads(toQ); status[x.se] = ROYAL; for (auto& y: back[x.fi]) { toQ.pop_back(); toQ.push_back(y); int newCnt = count_common_roads(toQ); if (newCnt > orig) { status[x.se] = NOT_ROYAL; status[y] = ROYAL; } } } } vector<int> ans {}; for (int i = 0; i < m; i++) if (status[i] == ROYAL) ans.push_back(i); return ans; }