Submission #1176278

#TimeUsernameProblemLanguageResultExecution timeMemory
1176278anha3k25cvpPotemkin cycle (CEOI15_indcyc)C++20
70 / 100
1096 ms5716 KiB
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define dl double
#define st first
#define nd second
#define II pair <int, int>

using namespace std;

const int N = 1 + 1e3;
const int inf = 7 + 1e9;

struct Edge {
    int u, v;
};

int node = 0, ncc = 0;
Edge e[100001];
int num[N], low[N], a[N], f[N][N], tr[N];
vector <int> adj[N];
stack <int> q;

void dfs(int u, int p) {
    num[u] = low[u] = ++ node;
    q.push(u);
    for (int i : adj[u]) {
        int v = e[i].u + e[i].v - u;
        if (v == p)
            continue;
        if (!num[v]) {
            dfs(v, u);
            low[u] = min(low[u], low[v]);
        }
        else
            low[u] = min(low[u], num[v]);
    }
    if (num[u] == low[u]) {
        int v = 0;
        ncc ++;
        while (v != u) {
            v = q.top(); q.pop();
            a[v] = ncc;
        }
    }
}

int main() {
#define TASKNAME ""
    ios_base :: sync_with_stdio (0);
    cin.tie (0);
    if ( fopen( TASKNAME".inp", "r" ) ) {
        freopen (TASKNAME".inp", "r", stdin);
        freopen (TASKNAME".out", "w", stdout);
    }
    int n, m; 
    cin >> n >> m;
    for (int i = 1; i <= m; i ++) {
        cin >> e[i].u >> e[i].v;
        adj[e[i].u].push_back(i);
        adj[e[i].v].push_back(i);
    }
    for (int i = 1; i <= n; i ++)
        if (!num[i])
            dfs(i, 0);
    for (int i = 1; i <= m; i ++) {
        int u = e[i].u, v = e[i].v;
        if (a[u] == a[v])
            f[u][v] = f[v][u] = 1;
    }
    queue <int> q;
    for (int id = 1; id <= m; id ++) {
        int s = e[id].u, t = e[id].v;
        if (a[s] != a[t])
            continue;
        for (int i = 1; i <= n; i ++)
            tr[i] = -1;
        vector <int> c;
        for (int u = 1; u <= n; u ++)
            if (a[u] == a[s] && !(f[s][u] & f[t][u]))
                c.push_back(u);
        c.push_back(t);
        q.push(s);
        tr[s] = 0;
        while (!q.empty()) {
            int u = q.front(); q.pop();
            for (int v : c) {
                if (u == s && v == t)
                    continue;
                if (tr[v] >= 0 || !f[u][v])
                    continue;
                q.push(v);
                tr[v] = u;
            }
        }
        if (tr[t] >= 0) {
            int u = t;
            while (u != 0) {
                cout << u << ' ';
                u = tr[u];
            }
            return 0;
        }
    }
    cout << "no";
    return 0;
}

Compilation message (stderr)

indcyc.cpp: In function 'int main()':
indcyc.cpp:53:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |         freopen (TASKNAME".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
indcyc.cpp:54:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         freopen (TASKNAME".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...