Submission #1059381

#TimeUsernameProblemLanguageResultExecution timeMemory
1059381MilosMilutinovicPotemkin cycle (CEOI15_indcyc)C++14
100 / 100
604 ms2424 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1005; int p[N], sz[N]; int root(int x) { return p[x] == x ? x : p[x] = root(p[x]); } void Merge(int x, int y) { x = root(x); y = root(y); if (x == y) { return; } if (sz[x] < sz[y]) { swap(x, y); } sz[x] += sz[y]; p[y] = x; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector<vector<bool>> c(n, vector<bool>(n)); vector<bitset<N>> cb(n); vector<vector<int>> g(n); for (int i = 0; i < m; i++) { int x, y; cin >> x >> y; --x; --y; c[x][y] = true; c[y][x] = true; g[x].push_back(y); g[y].push_back(x); cb[x][y] = 1; cb[y][x] = 1; } auto Solve = [&](int i, int j, int k) { vector<bool> del(n); del[k] = true; for (int p : g[k]) { if (p != i && p != j) { del[p] = true; } } vector<int> p(n, -1); vector<int> que(1, i); vector<int> d(n, -1); d[i] = 0; for (int b = 0; b < (int) que.size(); b++) { int i = que[b]; for (int j : g[i]) { if (del[j]) { continue; } if (d[j] == -1) { p[j] = i; d[j] = d[i] + 1; que.push_back(j); } } } vector<int> seq; for (int v = j; v != -1; v = p[v]) { seq.push_back(v); } seq.push_back(k); for (int i = 0; i < (int) seq.size(); i++) { cout << seq[i] + 1 << " "; } cout << '\n'; }; mt19937 rng(time(0)); vector<int> order(n); iota(order.begin(), order.end(), 0); shuffle(order.begin(), order.end(), rng); for (int k : order) { vector<bool> del(n); del[k] = true; for (int i : g[k]) { del[i] = true; } for (int i = 0; i < n; i++) { p[i] = i; sz[i] = 1; } for (int i = 0; i < n; i++) { if (del[i]) { continue; } for (int j : g[i]) { if (del[j]) { continue; } Merge(i, j); } } vector<vector<int>> ids(n); for (int i = 0; i < n; i++) { if (!c[i][k]) { continue; } for (int j : g[i]) { if (del[j]) { continue; } ids[root(j)].push_back(i); } } for (int i = 0; i < n; i++) { sort(ids[i].begin(), ids[i].end()); ids[i].erase(unique(ids[i].begin(), ids[i].end()), ids[i].end()); sort(ids[i].begin(), ids[i].end(), [&](int i, int j) { return (int) g[i].size() > (int) g[j].size(); }); int sz = (int) ids[i].size(); if ((int) ids[i].size() >= 300) { bitset<N> bs; bool found = false; for (int x = 0; x < sz; x++) { if ((cb[ids[i][x]] & bs) != bs) { found = true; break; } bs[ids[i][x]] = 1; } if (!found) { continue; } } for (int x = 0; x < sz; x++) { for (int y = x + 1; y < sz; y++) { if (!c[ids[i][x]][ids[i][y]]) { Solve(ids[i][x], ids[i][y], k); return 0; } } } } } cout << "no" << '\n'; return 0; }
#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...
#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...