Submission #1278424

#TimeUsernameProblemLanguageResultExecution timeMemory
1278424SonicML슈퍼트리 잇기 (IOI20_supertrees)C++17
100 / 100
114 ms26156 KiB
#include <vector> #include <iostream> #include "supertrees.h" using namespace std; int n; int const NMAX = 1000; int comp[3][NMAX]; int path[NMAX][NMAX]; int last[1 + NMAX]; int cleng[1 + NMAX]; void buildComp(int special, int node, int rep) { //cerr << special << ' ' << node << ' ' << rep << '\n'; if(comp[special][node] == -1) { comp[special][node] = rep; for(int i = 0;i < n;i++) { if(path[node][i] != 0 && path[node][i] <= special) { buildComp(special, i, rep); } } } } bool computeIsGood() { for(int i = 0;i < n;i++) { for(int j = i+1;j < n;j++) { if(comp[1][i] == comp[1][j] && path[i][j] != 1) { //cerr << "r1 " << i << ' ' << j << ' ' << path[i][j] << '\n'; return false; } else if(comp[2][i] == comp[2][j] && path[i][j] == 0) { //cerr << "r2 " << i << ' ' << j << ' ' << path[i][j] << '\n'; return false; } } } return true; } int construct(vector<vector<int>> p) { n = p.size(); vector<vector<int>> sol; for (int i = 0; i < n; i++) { vector<int> row; row.resize(n); sol.push_back(row); } //cerr << "done creation of sol\n"; for(int i = 0;i < n;i++) { comp[1][i] = comp[2][i] = -1; last[i] = -1; } for(int i = 0;i < n;i++) { if(p[i][i] != 1) { return 0; } for(int j = 0;j < n;j++) { path[i][j] = p[i][j]; if(p[i][j] == 3 || p[i][j] != p[j][i]) { return 0; } } } //cerr << "done creation of path\n"; //cerr << "first buildComp\n "; for(int i = 0;i < n;i++) { buildComp(1, i, i); //cerr << comp[1][i] << ' '; } //cerr << '\n'; //cerr << "second buildComp\n "; for(int i = 0;i < n;i++) { buildComp(2, i, i); //cerr << comp[2][i] << ' '; } //cerr << '\n'; bool isGood = computeIsGood(); if(!isGood) { return 0; } // build chains for(int i = 0;i < n;i++) { if(last[comp[1][i]] != -1) { int temp = last[comp[1][i]]; sol[i][temp] = sol[temp][i] = 1; } last[comp[1][i]] = i; } //cerr << "built chains\n"; // reset last for(int i = 0;i < n;i++) { last[i] = -1; } // build cycles for(int i = 0;i < n;i++) { if(comp[1][i] == i) { if(last[comp[2][i]] != -1) { int temp = last[comp[2][i]]; sol[i][temp] = sol[temp][i] = 1; cleng[comp[2][i]]++; } last[comp[2][i]] = i; } } for(int i = 0;i < n;i++) { if(comp[1][i] == i) { if(comp[2][i] == i && last[i] != i) { sol[i][last[i]] = sol[last[i]][i] = 1; cleng[comp[2][i]]++; } } } for(int i = 0;i < n;i++) { if(comp[1][i] == i && comp[2][i] == i) { if(cleng[comp[2][i]] == 2 || cleng[comp[2][i]] == 1) { return false; } } } //cerr << "built cycles\n"; build(sol); return 1; }
#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...