Submission #570025

# Submission time Handle Problem Language Result Execution time Memory
570025 2022-05-28T12:48:02 Z 600Mihnea Potemkin cycle (CEOI15_indcyc) C++17
90 / 100
1000 ms 1568 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], t[N];
bool valid[N];
vector<int> g[N], gather[N];

void clr() {
  for (int i = 1; i <= n; i++) {
    t[i] = i;
  }
}

int get_root(int a) {
  if (t[a] == a) {
    return a;
  } else {
    return t[a] = get_root(t[a]);
  }
}

void join(int a, int b) {
  t[get_root(a)] = get_root(b);
}

bool is_edge(int a, int b) {
  int low = 0, high = (int) g[a].size() - 1;
  while (low <= high) {
    int mid = (low + high) / 2;
    if (g[a][mid] == b) {
      return 1;
    }
    if (g[a][mid] < b) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  return 0;
}

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

 /// freopen ("input.txt", "r", stdin);

  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);
  }
  for (int i = 1; i <= n; i++) {
    sort(g[i].begin(), g[i].end());
  }
  for (int root = 1; root <= n; root++) {
    clr();
    for (int i = 1; i <= n; i++) {
      valid[i] = 1;
      gather[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]) {
            join(i, j);
          }
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      if (valid[i]) {
        gather[get_root(i)].push_back(i);
      }
    }
    int v1_sol, v2_sol;
    bool found = 0;
    for (int i = 1; i <= n && !found; i++) {
      if (valid[i] && get_root(i) == i) {
        vector<int> verts;
        for (auto &member : gather[i]) {
          for (auto &copil : g[member]) {
            if (copil != root && !valid[copil]) {
              verts.push_back(copil);
            }
          }
        }
        sort(verts.begin(), verts.end());
        verts.resize(unique(verts.begin(), verts.end()) - verts.begin());
        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);
        }
      }
    }
    assert(dist[v1] != -1);
    if (dist[v2] != -1 && dist[v2] != INF) {
      while (v2 != v1) {
        cout << v2 << " ";
        v2 = par[v2];
      }
      cout << v1 << " " << root << "\n";
      exit(0);
    } else {
      assert(0);
    }

  }
  cout << "no\n";
  exit(0);
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 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 0 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 4 ms 352 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 460 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 3 ms 468 KB Output is correct
4 Correct 43 ms 484 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 340 KB Output is correct
2 Correct 37 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 864 KB Output is correct
2 Correct 10 ms 708 KB Output is correct
3 Correct 936 ms 1060 KB Output is correct
4 Correct 412 ms 1040 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 724 KB Output is correct
2 Correct 712 ms 1252 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 1364 KB Output is correct
2 Correct 23 ms 1364 KB Output is correct
3 Correct 55 ms 1356 KB Output is correct
4 Execution timed out 1085 ms 1568 KB Time limit exceeded
5 Halted 0 ms 0 KB -