답안 #570032

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
570032 2022-05-28T12:57:28 Z 600Mihnea Potemkin cycle (CEOI15_indcyc) C++17
100 / 100
614 ms 2840 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 1000 + 7;
const int INF = (int) 1e9 + 7;
int n, m, dist[N], par[N];
bool is_edge[N][N];
bool valid[N], vis[N];
vector<int> g[N], g2[N], gather;
int last_time[N], current_time;

void dfs(int a) {
  gather.push_back(a);
  vis[a] = 1;
  for (auto &b : g2[a]) {
    if (!vis[b] && valid[b]) {
      dfs(b);
    }
  }
}


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

  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    is_edge[a][b] = is_edge[b][a] = 1;
  }
  for (int i = 1; i <= n; i++) {
    sort(g[i].begin(), g[i].end());
  }
  for (int root = 1; root <= n; root++) {
    for (int i = 1; i <= n; i++) {
      valid[i] = 1;
      vis[i] = 0;
      g2[i].clear();
    }
    valid[root] = 0;
    for (auto &v : g[root]) {
      valid[v] = 0;
    }
    for (int i = 1; i <= n; i++) {
      if (valid[i]) {
        for (auto &j : g[i]) {
          if (valid[j]) {
            g2[i].push_back(j);
          }
        }
      }
    }
    int v1_sol, v2_sol;
    bool found = 0;
    for (int zd = 1; zd <= n; zd++) {
      if (vis[zd] == 0 && valid[zd]) {
        gather.clear();
        dfs(zd);
        vector<int> verts;
        current_time++;
        for (auto &member : gather) {
          for (auto &copil : g[member]) {
            if (copil != root && !valid[copil] && last_time[copil] < current_time) {
              last_time[copil] = current_time;
              verts.push_back(copil);
            }
          }
        }
        sort(verts.begin(), verts.end());
        {
          set<int> sv;
          for (auto &x : verts) sv.insert(x);
          assert((int) sv.size() == (int) verts.size());
        }
        if ((int) verts.size() >= 2) {
          for (auto &v1 : verts) {
            for (auto &v2 : verts) {
              if (found) break;
              if (v1 == v2) break;
              if (is_edge[v1][v2]) continue;

              v1_sol = v1;
              v2_sol = v2;
              found = 1;
            }
          }
        }
      }
    }
    if (!found) continue;
    int v1 = v1_sol, v2 = v2_sol;

    for (int i = 1; i <= n; i++) {
      dist[i] = INF;
      par[i] = 0;
    }
    dist[root] = -1;
    for (auto &v : g[root]) {
      if (v != v1 && v != v2) {
        dist[v] = -1;
      }
    }
    queue<int> q;
    dist[v1] = 0;
    q.push(v1);
    while (!q.empty()) {
      int a = q.front();
      q.pop();
      for (auto &b : g[a]) {
        if (dist[b] == INF) {
          dist[b] = 1 + dist[a];
          par[b] = a;
          q.push(b);
        }
      }
    }
    while (v2 != v1) {
      cout << v2 << " ";
      v2 = par[v2];
    }
    cout << v1 << " " << root << "\n";
    return 0;
  }
  cout << "no\n";
}

Compilation message

indcyc.cpp: In function 'int main()':
indcyc.cpp:121:15: warning: 'v1_sol' may be used uninitialized in this function [-Wmaybe-uninitialized]
  121 |     while (v2 != v1) {
      |            ~~~^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 3 ms 508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 776 KB Output is correct
2 Correct 2 ms 724 KB Output is correct
3 Correct 3 ms 724 KB Output is correct
4 Correct 29 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 724 KB Output is correct
2 Correct 18 ms 768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 2388 KB Output is correct
2 Correct 8 ms 1908 KB Output is correct
3 Correct 561 ms 2504 KB Output is correct
4 Correct 251 ms 1948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 1876 KB Output is correct
2 Correct 352 ms 2004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 1744 KB Output is correct
2 Correct 29 ms 1820 KB Output is correct
3 Correct 35 ms 2840 KB Output is correct
4 Correct 614 ms 2824 KB Output is correct