# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
24672 | Bruteforceman | Potemkin cycle (CEOI15_indcyc) | C++11 | 1000 ms | 8328 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
int n, m;
vector <int> g[1005];
bool vis[1005];
int par[1005];
vector <int> l, r;
bool del[100010];
bool bad[100010];
int mat[1005][1005];
vector <int> path (int c, int b) {
for(int i = 0; i < m; i++) {
if(bad[l[i]] && bad[r[i]]) continue;
if(l[i] == c || r[i] == c || l[i] == b || r[i] == b) {
del[i] = false;
}
}
memset(vis, false, sizeof vis);
memset(par, false, sizeof par);
queue <int> q;
q.push(b);
vis[b] = true;
par[b] = -1;
while(not q.empty()) {
int x = q.front();
q.pop();
for(int i : g[x]) {
int y = l[i] ^ r[i] ^ x;
if(vis[y] == false && del[i] == false) {
par[y] = x;
vis[y] = true;
q.push(y);
}
}
}
vector <int> ans;
int cur = c;
while(cur != -1) {
ans.push_back(cur);
cur = par[cur];
}
return ans;
}
vector <int> bad_nodes;
void dfs(int x) {
vis[x] = true;
for(auto i : g[x]) {
int y = l[i] ^ r[i] ^ x;
if(bad[y] == true) {
bad_nodes.push_back(y);
}
if(vis[y] == false && del[i] == false) {
dfs(y);
}
}
}
void check(int root) {
memset(vis, false, sizeof vis);
memset(del, false, sizeof del);
memset(bad, false, sizeof bad);
bad[root] = true;
for(auto i : g[root]) {
bad[l[i] ^ r[i] ^ root] = true;
}
for(int i = 0; i < m; i++) {
if(bad[l[i]] || bad[r[i]]) {
del[i] = true;
}
}
for(int i = 1; i <= n; i++) {
if(vis[i] == false && bad[i] == false) {
bad_nodes.clear();
dfs(i);
bool good = false;
int p = -1;
int q = -1;
for(auto j : bad_nodes) {
for(auto k : bad_nodes) {
if(mat[j][k] == 0 && k != j) {
p = j;
q = k;
good = true;
goto here;
}
}
}
here:
if(good) {
vector <int> ans = path(p, q);
for(auto j : ans) {
printf("%d ", j);
}
printf("%d\n", root);
exit(0);
}
}
}
}
int main(int argc, char const *argv[])
{
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
int p, q;
scanf("%d %d", &p, &q);
g[p].push_back(i);
g[q].push_back(i);
l.push_back(p);
r.push_back(q);
mat[p][q] = mat[q][p] = 1;
}
for(int i = 1; i <= n; i++) {
check(i);
}
printf("no\n");
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |