답안 #35996

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
35996 2017-12-04T06:19:04 Z funcsr Potemkin cycle (CEOI15_indcyc) C++14
50 / 100
1000 ms 3004 KB
#include <iostream>
#include <fstream>
#include <bitset>
#include <cassert>
#include <vector>
#include <queue>
#include <algorithm>
#define rep(i, n) for (int i=0; i<(n); i++)
#define INF 1145141919
#define all(x) x.begin(), x.end()
#define pb push_back
using namespace std;

int N, M;
bool G[1000][1000];
int A[1000], pre[1000];
int U[10];
bool used[10];
int find(int x) {
  if (U[x] == x) return x;
  return U[x] = find(U[x]);
}
void unite(int x, int y) {
  x = find(x), y = find(y);
  U[x] = y;
}

signed main() {
  cin >> N >> M;
  rep(i, M) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    G[a][b] = G[b][a] = true;
  }
  rep(s, N) {
    rep(i, N) A[i] = -1;
    queue<int> q;
    rep(t, N) if (G[s][t]) {
      pre[t] = s;
      A[t] = t;
      q.push(t);
    }
    while (!q.empty()) {
      int x = q.front(); q.pop();
      rep(t, N) if (G[x][t]) {
        if (t == s) continue;
        if (A[t] == -1) {
          A[t] = A[x], pre[t] = x;
          q.push(t);
        }
        else {
          int a = A[x], b = A[t];
          if (a == b || G[a][b]) continue;
          vector<int> left, right;
          while (x != s) {
            left.pb(x);
            x = pre[x];
          }
          while (t != s) {
            right.pb(t);
            t = pre[t];
          }
          reverse(all(right));
          left.pb(s);
          for (int r : right) left.pb(r);
          for (int x : left) cout << x+1 << " "; cout << "\n";
          return 0;
        }
      }
    }
  }
  if (N <= 10) {
    rep(S, 1<<N) {
      if (__builtin_popcount(S) < 4) continue;
      rep(i, N) U[i] = i;
      bool ok = true;
      int hoe = -1;
      rep(i, N) {
        if (((S>>i)&1) == 0) continue;
        hoe = i;
        int deg = 0;
        rep(t, N) if (G[i][t] && (S>>t)&1) unite(i, t), deg++;
        if (deg != 2) {
          ok = false;
          break;
        }
      }
      rep(i, N) if ((S>>i)&1) if (find(hoe) != find(i)) ok = false;
      if (!ok) continue;
      vector<int> vs;
      int v = hoe;
      used[v] = true;
      vs.pb(v);
      while (true) {
        int to = -1;
        rep(t, N) if (G[v][t] && (S>>t)&1 && !used[t]) to = t;
        if (to == -1) break;
        used[to] = true;
        v = to;
        vs.pb(v);
      }
      assert(vs.size() == __builtin_popcount(S));
      for (int x : vs)cout<<x+1<< " ";cout<<"\n";
      return 0;
    }
  }
  cout << "no\n";
  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 3004 KB Output is correct
2 Correct 0 ms 3004 KB Output is correct
3 Correct 0 ms 3004 KB Output is correct
4 Correct 0 ms 3004 KB Output is correct
5 Correct 0 ms 3004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 3004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 3004 KB Output is correct
2 Correct 0 ms 3004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 3004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 3004 KB Expected integer, but "no" found
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 106 ms 3004 KB Output is correct
2 Correct 0 ms 3004 KB Output is correct
3 Correct 6 ms 3004 KB Output is correct
4 Correct 123 ms 3004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 113 ms 3004 KB Expected integer, but "no" found
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 59 ms 3004 KB Output is correct
2 Correct 39 ms 3004 KB Output is correct
3 Execution timed out 1000 ms 3004 KB Execution timed out
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1000 ms 3004 KB Execution timed out
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 323 ms 3004 KB Expected integer, but "no" found
2 Halted 0 ms 0 KB -