Submission #303962

#TimeUsernameProblemLanguageResultExecution timeMemory
303962AlanCConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
295 ms26360 KiB
#include "supertrees.h" #include <vector> #include <cstdio> #define N 1005 using namespace std; int n, cnt; vector<vector<int>> answer, cp, e, cyc; vector<int> s; int v[N], in[N]; bool error = false; void DFS(int x) { s.push_back(x); v[x] = 1; for (int i=0; i<n; i++) if (e[x][i] == 1 && !v[i]) DFS(i); } void findTrees() { cnt = 0; cp.clear(); for (int i=0; i<n; i++) v[i] = 0; for (int i=0; i<n; i++) if (!v[i]) { s.clear(); DFS(i); cp.push_back(s); } } void checkTrees() { for (int k=0; k<cp.size(); k++) { for (int i=0; i<cp[k].size(); i++) in[cp[k][i]] = k; } for (int k=0; k<cp.size(); k++) { for (int j=0; j<n; j++) { int last = -1; for (int i=0; i<cp[k].size(); i++) { int x = cp[k][i]; if (in[x] == in[j]) { if (e[x][j] != 1) error = true; } else { if (last == -1) last = e[x][j]; else if (last != e[x][j]) error = true; } } } } } void DFS_C(int x) { v[x] = 1; s.push_back(x); for (int i=0; i<cp.size(); i++) if (!v[i] && e[cp[x][0]][cp[i][0]] == 2) DFS_C(i); } void fixCycles() { cyc.clear(); for (int i=0; i<cp.size(); i++) v[i] = 0; for (int i=0; i<cp.size(); i++) if (!v[i]) { s.clear(); DFS_C(i); cyc.push_back(s); } } void checkCycles() { for (int k=0; k<cyc.size(); k++) { for (int i=0; i<cyc[k].size(); i++) for (int j=0; j<i; j++) { int x = cp[cyc[k][i]][0]; int y = cp[cyc[k][j]][0]; if (e[x][y] != 2 || e[y][x] != 2) error = true; } } } void check3() { for (int i=0; i<n; i++) for (int j=0; j<n; j++) if (e[i][j] == 3) error = true; } int construct(vector<vector<int>> p) { n = p.size(); e = p; /* vector<vector<int>> answer; for (int i = 0; i < n; i++) { vector<int> row; row.resize(n); answer.push_back(row); } */ findTrees(); checkTrees(); if (error) return 0; fixCycles(); checkCycles(); if (error) return 0; check3(); if (error) return 0; for (int i=0; i<n; i++) { vector<int> row; row.resize(n); answer.push_back(row); } for (int i=0; i<cp.size(); i++) { for (int j=0; j<cp[i].size()-1; j++) { int x = cp[i][j]; int y = cp[i][j+1]; answer[x][y] = answer[y][x] = 1; } } for (int i=0; i<cyc.size(); i++) { if (cyc[i].size() == 1) continue; if (cyc[i].size() == 2) error = true; for (int j=0; j<cyc[i].size(); j++) { int x = cp[cyc[i][j]][0]; int y = cp[cyc[i][(j+1) % cyc[i].size()]][0]; answer[x][y] = answer[y][x] = 1; } } if (error) return 0; build(answer); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'void checkTrees()':
supertrees.cpp:39:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for (int k=0; k<cp.size(); k++) {
      |                ~^~~~~~~~~~
supertrees.cpp:40:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |   for (int i=0; i<cp[k].size(); i++)
      |                 ~^~~~~~~~~~~~~
supertrees.cpp:44:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |  for (int k=0; k<cp.size(); k++) {
      |                ~^~~~~~~~~~
supertrees.cpp:47:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |    for (int i=0; i<cp[k].size(); i++) {
      |                  ~^~~~~~~~~~~~~
supertrees.cpp: In function 'void DFS_C(int)':
supertrees.cpp:64:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |  for (int i=0; i<cp.size(); i++)
      |                ~^~~~~~~~~~
supertrees.cpp: In function 'void fixCycles()':
supertrees.cpp:71:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |  for (int i=0; i<cp.size(); i++) v[i] = 0;
      |                ~^~~~~~~~~~
supertrees.cpp:72:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |  for (int i=0; i<cp.size(); i++)
      |                ~^~~~~~~~~~
supertrees.cpp: In function 'void checkCycles()':
supertrees.cpp:82:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |  for (int k=0; k<cyc.size(); k++) {
      |                ~^~~~~~~~~~~
supertrees.cpp:83:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |   for (int i=0; i<cyc[k].size(); i++)
      |                 ~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:125:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |  for (int i=0; i<cp.size(); i++) {
      |                ~^~~~~~~~~~
supertrees.cpp:126:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |   for (int j=0; j<cp[i].size()-1; j++) {
      |                 ~^~~~~~~~~~~~~~~
supertrees.cpp:133:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |  for (int i=0; i<cyc.size(); i++) {
      |                ~^~~~~~~~~~~
supertrees.cpp:136:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |   for (int j=0; j<cyc[i].size(); j++) {
      |                 ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...