답안 #300652

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
300652 2020-09-17T11:02:28 Z abeker 슈퍼트리 잇기 (IOI20_supertrees) C++17
0 / 100
1 ms 384 KB
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;

class EquivRelation {
  int n;
  vector <bool> vis;
  vector <vector <int>> adj;
public:
  EquivRelation(int _n) {
    n = _n;
    adj.resize(n);
    vis.resize(n);
  }
  void addEdge(int u, int v) {
    adj[u].push_back(v);
  }
  void dfs(int x, vector <int> &comp) {
    vis[x] = true;
    comp.push_back(x);
    for (auto it : adj[x])
      if (!vis[it])
        dfs(it, comp);
  }
  bool isClique(const vector <int> &v) const {
    for (auto it : v)
      if (adj[it].size() != v.size())
        return false;
    return true;
  }
  vector <vector <int>> getClasses() {
    vector <vector <int>> res;
    for (int i = 0; i < n; i++) 
      if (!vis[i]) {
        vector <int> curr;
        dfs(i, curr);
        if (!isClique(curr))
          return vector <vector <int>> ();
        res.push_back(curr);
      }
    return res;
  }
};

int construct(vector <vector <int>> p) {
  int N = p.size();
  EquivRelation conn(N), one(N);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      if (p[i][j])
        conn.addEdge(i, j);
      else if (p[i][j] == 1)
        one.addEdge(i, j);  
      else if (p[i][j] == 3)
        return 0;
  vector <vector <int>> comps = conn.getClasses();
  vector <vector <int>> groups = one.getClasses();
  if (comps.empty() || groups.empty())
    return 0;
  int sz = comps.size();
  vector <int> idx(sz);
  for (int i = 0; i < sz; i++)
    for (auto it : comps[i])
      idx[it] = i;
  vector <vector <int>> b(N, vector <int> (N, 0));
  auto make_edge = [&](int u, int v) {
    b[u][v] = b[v][u] = 1;
  };
  vector <vector <int>> cycle(sz);
  for (auto it : groups) {
    for (int i = 1; i < it.size(); i++)
      make_edge(it[0], it[i]);
    cycle[idx[it[0]]].push_back(it[0]);
  }
  for (auto it : cycle)
    if (it.size() > 1)
      for (int i = 0; i < it.size(); i++)
        make_edge(it[i], it[(i + 1) % it.size()]);
  build(b);
  return 1;
}

Compilation message

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:71:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |     for (int i = 1; i < it.size(); i++)
      |                     ~~^~~~~~~~~~~
supertrees.cpp:77:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |       for (int i = 0; i < it.size(); i++)
      |                       ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 384 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -