제출 #393147

#제출 시각아이디문제언어결과실행 시간메모리
393147dolphingarlicPotemkin cycle (CEOI15_indcyc)C++14
30 / 100
1131 ms576864 KiB
/*
CEOI 2016 Potemkin Cycle
- Let each edge (u, v) represent a node (uv) in graph H
- There is an edge between (uv) and (vw) in H iff (uw) doesn't exist
    - This means that there are no cycles of length 3 in H
    - We can construct H in O(NR) time
- An answer exists iff a cycle exists in H; run DFS to find a cycle
*/

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

int u[200001], v[200001], adj[1001][1001];
vector<int> graph[100001];
int prv[100001], visited[100001];

void dfs(int node, int root, int parent = -1) {
    visited[node] = root;
    prv[node] = parent;
    for (int i : graph[node]) if (i != parent) {
        if (prv[i]) {
            if (visited[i] == root) {
                vector<int> edges = {i};
                int curr = node;
                while (curr != i) {
                    edges.push_back(curr);
                    curr = prv[curr];
                }
                int m = edges.size();
                for (int j = 0; j < m; j++) cout << u[edges[j]] << ' ';
                exit(0);
            }
        } else dfs(i, root, node);
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, r;
    cin >> n >> r;
    for (int i = 1; i <= r; i++) {
        cin >> u[i] >> v[i];
        u[i + r] = v[i], v[i + r] = u[i];
        adj[u[i]][v[i]] = i, adj[v[i]][u[i]] = i + r;
    }

    for (int i = 1; i <= 2 * r; i++) {
        for (int j = 1; j <= n; j++) if (j != u[i]) {
            if (adj[v[i]][j] && !adj[u[i]][j])
                graph[i].push_back(adj[v[i]][j]);
        }
    }

    for (int i = 1; i <= 2 * r; i++) if (!visited[i]) dfs(i, i);
    cout << "no";
    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...