제출 #301394

#제출 시각아이디문제언어결과실행 시간메모리
301394Gilgamesh슈퍼트리 잇기 (IOI20_supertrees)C++17
40 / 100
279 ms22264 KiB
#include "supertrees.h" #include <vector> #include <set> const int mxN = 1000; int parent[mxN]; int parent2[mxN]; int rnk[mxN]; int rnk2[mxN]; int find(int x) { if(parent[x] == -1) parent[x] = x; if (parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; } bool merge(int x, int y) { int xRoot = find(x), yRoot = find(y); if (xRoot == yRoot) return false; if (rnk[xRoot] < rnk[yRoot]) parent[xRoot] = yRoot; else if (rnk[yRoot] < rnk[xRoot]) parent[yRoot] = xRoot; else { parent[yRoot] = xRoot; rnk[xRoot] = rnk[xRoot] + 1; } return true; } int find2(int x) { if(parent2[x] == -1) parent2[x] = x; if (parent2[x] != x) { parent2[x] = find(parent2[x]); } return parent[x]; } bool merge2(int x, int y) { int xRoot = find(x), yRoot = find(y); if (xRoot == yRoot) return false; if (rnk2[xRoot] < rnk2[yRoot]) parent2[xRoot] = yRoot; else if (rnk2[yRoot] < rnk2[xRoot]) parent2[yRoot] = xRoot; else { parent2[yRoot] = xRoot; rnk2[xRoot] = rnk2[xRoot] + 1; } return true; } int construct(std::vector<std::vector<int>> p) { int n = p.size(); std::vector<std::vector<int>> answer; for (int i = 0; i < n; i++) { std::vector<int> row; row.resize(n); answer.push_back(row); } bool zero = false, one = false, two = false, three = false; for(int i = 0; i < n; ++i){ for(int j = i + 1; j < n; ++j){ if(p[i][j] == 0) zero = true; else if(p[i][j] == 1) one = true; else if(p[i][j] == 2) two = true; else three = true; } } for(int i = 0; i < n; ++i){ parent[i] = i; parent2[i] = i; } if(!one && !three){ for(int i = 0; i < n; ++i){ for(int j = i + 1; j < n; ++j){ if(!p[i][j] && find(i) == find(j)){ return 0; } if(p[i][j]) merge(i, j); } } for(int i = 0; i < n; ++i){ for(int j = i + 1; j < n; ++j){ if(!p[i][j] && find(i) == find(j)) return 0; } } std::vector<int> sets[n]; for(int i = 0; i < n; ++i){ int rep = find(i); sets[rep].emplace_back(i); } for(int i = 0; i < n; ++i){ int sz = sets[i].size(); if(sz == 2) return 0; for(int j = 0; j < sz - 1; ++j){ answer[sets[i][j]][sets[i][j + 1]] = 1; answer[sets[i][j + 1]][sets[i][j]] = 1; } if(sz > 1){ answer[sets[i][0]][sets[i][sz-1]] = 1; answer[sets[i][sz-1]][sets[i][0]] = 1; } } } else if(!two && !three){ for(int i = 0; i < n; ++i){ for(int j = i + 1; j < n; ++j){ if(!p[i][j] && find(i) == find(j)){ return 0; } if(p[i][j]) merge(i, j); } } for(int i = 0; i < n; ++i){ for(int j = i + 1; j < n; ++j){ if(!p[i][j] && find(i) == find(j)) return 0; } } for(int i = 0; i < n; ++i){ int rep = find(i); if(rep == i) continue; answer[rep][i] = 1; answer[i][rep] = 1; } } else if(!three){ std::vector<int> sets[n]; for(int i = 0; i < n; ++i){ bool o = false, t = false; for(int j = 0; j < n; ++j){ if(i == j) continue; if(p[i][j] == 1) o = true; else if(p[i][j] == 2) t = true; } if(!o && !t) continue; if(t){ for(int j = 0; j < n; ++j){ if(i == j) continue; merge2(i, j); } } else if(o){ for(int j = 0; j < n; ++j){ if(i == j) continue; if(p[i][j] == 1){ answer[i][j] = 1; answer[j][i] = 1; break; } } } } for(int i = 0; i < n; ++i){ int rep = find(i); sets[rep].emplace_back(i); } for(int i = 0; i < n; ++i){ int sz = sets[i].size(); if(sz == 2) return 0; for(int j = 0; j < sz - 1; ++j){ answer[sets[i][j]][sets[i][j + 1]] = 1; answer[sets[i][j + 1]][sets[i][j]] = 1; } if(sz > 1){ answer[sets[i][0]][sets[i][sz-1]] = 1; answer[sets[i][sz-1]][sets[i][0]] = 1; } } } build(answer); return 1; }

컴파일 시 표준 에러 (stderr) 메시지

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:71:10: warning: variable 'zero' set but not used [-Wunused-but-set-variable]
   71 |     bool zero = false, one = false, two = false, three = false;
      |          ^~~~
#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...