Submission #245347

#TimeUsernameProblemLanguageResultExecution timeMemory
245347lycPotemkin cycle (CEOI15_indcyc)C++14
60 / 100
1084 ms7880 KiB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
using ii = pair<int,int>;

const int mxN = 1e3+5;
const int mxR = 1e5+5;

int N, R;
vector<int> al[mxN];

int dist[mxN], pa[mxN], rt[mxN];
int mnrtd[mxN][mxN];
vector<int> ans;

bool solve(int s) {
    memset(dist,-1,sizeof dist);
    memset(pa,-1,sizeof pa);
    memset(rt,-1,sizeof rt);
    queue<int> q;
    
    vector<ii> tmp;
    for (int v : al[s]) dist[v] = 1, rt[v] = v, q.push(v);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : al[u]) if (v != s) {
            if (dist[v] == -1) {
                dist[v] = dist[u]+1;
                pa[v] = u;
                rt[v] = rt[u];
                q.push(v);
            } else if (rt[v] != rt[u] && mnrtd[rt[u]][rt[v]] == -1) {
                mnrtd[rt[u]][rt[v]] = mnrtd[rt[v]][rt[u]] = dist[u]+dist[v]+1;
                tmp.emplace_back(u,v);
            }
        }
    }

    for (ii x : tmp) {
        int u = x.first, v = x.second;
        if (mnrtd[rt[u]][rt[v]] >= 4) {
            for (int y = u; y != -1; y = pa[y]) ans.push_back(y);
            ans.push_back(s);
            reverse(ALL(ans));
            for (int y = v; y != -1; y = pa[y]) ans.push_back(y);
            return true;
        }
        mnrtd[rt[u]][rt[v]] = mnrtd[rt[v]][rt[u]] = -1;
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> R;
    FOR(i,1,R){
        int A, B; cin >> A >> B;
        al[A].push_back(B);
        al[B].push_back(A);
    }

    memset(mnrtd,-1,sizeof mnrtd);
    FOR(i,1,N){
        if (solve(i)) {
            for (int x : ans) {
                cout << x << ' ';
            }
            cout << '\n';
            return 0;
        }
    }
    cout << "no" << '\n';
}

#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...