답안 #564116

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
564116 2022-05-18T15:14:04 Z piOOE Potemkin cycle (CEOI15_indcyc) C++17
90 / 100
341 ms 172276 KB
#include <bits/stdc++.h>

using namespace std;

#define all(x) begin(x), end(x)
#define sz(x) ((int)size(x))
#define trace(x) cout << #x << ": " << (x) << endl;

typedef long long ll;

const int N = 1000, M = 100000;


int A[M], B[M], C[2][M];

bool e[N][N];
vector<pair<int, int>> adj[N];
vector<pair<int, int>> g[2][M];

vector<pair<int, int>> st;

bool used[2][M];
bool usd[N];

void dfs(int t, int v, pair<int, int> p) {
    used[t][v] = true;
    usd[C[t][v]] = true;
    st.emplace_back(t, v);
    for (auto to: g[t][v]) {
        if (to != p) {
            if (usd[C[to.first][to.second]] && used[to.first][to.second]) {
                memset(usd, 0, sizeof(usd));
                st.emplace_back(to);
                int lst = -1;
                while (!usd[C[st.back().first][st.back().second]]) {
                    auto mm = st.back();
                    cout << C[mm.first][mm.second] + 1 << " ";
                    if (lst != -1) {
                        assert(e[lst][C[mm.first][mm.second]]);
                    }
                    lst = C[mm.first][mm.second];
                    usd[C[mm.first][mm.second]] = true;
                    st.pop_back();
                }
                exit(0);
            }
        }
    }
    for (auto to: g[t][v]) {
        if (to != p) {
            if (!used[to.first][to.second]) {
                dfs(to.first, to.second, {t, v});
            } else if (usd[C[to.first][to.second]]) {
                memset(usd, 0, sizeof(usd));
                st.emplace_back(to);
                int lst = -1;
                while (!usd[C[st.back().first][st.back().second]]) {
                    auto mm = st.back();
                    cout << C[mm.first][mm.second] + 1 << " ";
                    if (lst != -1) {
                        assert(e[lst][C[mm.first][mm.second]]);
                    }
                    lst = C[mm.first][mm.second];
                    usd[C[mm.first][mm.second]] = true;
                    st.pop_back();
                }
                exit(0);
            }
        }
    }
    usd[C[t][v]] = false;
    st.pop_back();
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, r;
    cin >> n >> r;
    for (int i = 0; i < r; ++i) {
        cin >> A[i] >> B[i];
        --A[i], --B[i];
        C[0][i] = A[i];
        C[1][i] = B[i];
        adj[A[i]].emplace_back(B[i], i);
        adj[B[i]].emplace_back(A[i], i);
        e[A[i]][B[i]] = e[B[i]][A[i]] = true;
    }
    for (int v = 0; v < n; ++v) {
        for (auto [a, i]: adj[v]) {
            for (auto [b, j]: adj[v]) {
                if (i != j && !e[a][b]) {
                    int t1 = (B[i] == a);
                    int t2 = (B[j] == v);
                    g[t1][i].emplace_back(t2, j);
                }
            }
        }
    }
    for (int v = 0; v < r; ++v) {
        if (!used[0][v]) {
            dfs(0, v, {-1, -1});
        }
        if (!used[1][v]) {
            dfs(1, v, {-1, -1});
        }
    }
    cout << "no";
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5076 KB Output is correct
2 Correct 2 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 5028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5076 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5076 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5588 KB Output is correct
2 Correct 4 ms 5716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5936 KB Output is correct
2 Correct 5 ms 5844 KB Output is correct
3 Correct 14 ms 9600 KB Output is correct
4 Correct 16 ms 9684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 8276 KB Output is correct
2 Correct 13 ms 8536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 35980 KB Output is correct
2 Incorrect 26 ms 12084 KB Wrong adjacency
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 134 ms 95048 KB Output is correct
2 Correct 169 ms 103400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 129 ms 9548 KB Output is correct
2 Correct 116 ms 9244 KB Output is correct
3 Correct 298 ms 172108 KB Output is correct
4 Correct 341 ms 172276 KB Output is correct