Submission #1228831

#TimeUsernameProblemLanguageResultExecution timeMemory
1228831ericl23302Thousands Islands (IOI22_islands)C++20
5 / 100
28 ms24136 KiB
#include "islands.h" #include <bits/stdc++.h> using namespace std; pair<int, int> dfs(vector<bool> &visited, vector<int> &parents, vector<vector<int>> &adjacency1, vector<vector<int>> &adjacency2, int cur, int parent) { visited[cur] = true; parents[cur] = parent; if (!adjacency2[cur].empty()) return {cur, -1}; for (int &child : adjacency1[cur]) { if (child == parent) continue; if (visited[child]) return {cur, child}; auto curRes = dfs(visited, parents, adjacency1, adjacency2, child, cur); if (curRes.first != -1) return curRes; } return {-1, -1}; } std::variant<bool, std::vector<int>> find_journey(int N, int M, std::vector<int> U, std::vector<int> V) { vector<vector<vector<int>>> adjacencyMatrix(N, vector<vector<int>>(N)); vector<vector<int>> adjacency1(N), adjacency2(N); for (int i = 0; i < M; ++i) adjacencyMatrix[U[i]][V[i]].push_back(i); for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { if (adjacencyMatrix[i][j].size() == 1) adjacency1[i].push_back(j), adjacency1[j].push_back(i); else if (adjacencyMatrix[i][j].size() > 1) adjacency2[i].push_back(j), adjacency2[j].push_back(i); } } vector<bool> visited(N, false); vector<int> parents(N, -1); auto res = dfs(visited, parents, adjacency1, adjacency2, 0, -1); if (res.first == -1) return false; vector<int> journey, cycle; vector<bool> newVisited(N, false); int cur = res.first; while (cur != -1) { journey.push_back(cur); newVisited[cur] = true; cur = parents[cur]; } reverse(journey.begin(), journey.end()); if (res.second == -1) { cycle.push_back(res.first); cycle.push_back(adjacency2[res.first][0]); } else { vector<int> journey2; int cur2 = res.second; while (cur2 != -1) { if (newVisited[cur2]) break; journey2.push_back(cur2); cur2 = parents[cur2]; } reverse(journey2.begin(), journey2.end()); int i = 0; while (journey[i] != cur2) ++i; while (journey.size() > i) { cycle.push_back(journey.back()); journey.pop_back(); } journey.push_back(cur2); reverse(cycle.begin(), cycle.end()); while (!journey2.empty()) { cycle.push_back(journey2.back()); journey2.pop_back(); } } // for (int &i : journey) cout << i << ' '; // cout << endl; vector<int> ans; int jSz = journey.size(), cSz = cycle.size(); for (int i = 0; i < jSz - 1; ++i) ans.push_back(adjacencyMatrix[journey[i]][journey[i + 1]][0]); if (cSz == 2) { int a = cycle[0], b = cycle[1]; ans.push_back(adjacencyMatrix[a][b][0]); ans.push_back(adjacencyMatrix[b][a][0]); ans.push_back(adjacencyMatrix[a][b][1]); ans.push_back(adjacencyMatrix[a][b][0]); ans.push_back(adjacencyMatrix[b][a][0]); ans.push_back(adjacencyMatrix[a][b][1]); } else { cycle.push_back(cycle[0]); vector<int> cycle2; for (int &i : cycle) cycle2.push_back(i); reverse(cycle2.begin(), cycle2.end()); // for (int &i : cycle) cout << i << ' '; // cout << endl; // for (int &i : cycle2) cout << i << ' '; // cout << endl; cSz = cycle.size(); for (int i = 0; i < cSz - 1; ++i) ans.push_back(adjacencyMatrix[cycle[i]][cycle[i + 1]][0]); for (int i = 0; i < cSz - 1; ++i) ans.push_back(adjacencyMatrix[cycle2[i]][cycle2[i + 1]][0]); for (int i = cSz - 2; i >= 0; --i) ans.push_back(adjacencyMatrix[cycle[i]][cycle[i + 1]][0]); for (int i = cSz - 2; i >= 0; --i) ans.push_back(adjacencyMatrix[cycle2[i]][cycle2[i + 1]][0]); } for (int i = jSz - 2; i >= 0; --i) ans.push_back(adjacencyMatrix[journey[i]][journey[i + 1]][0]); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...