제출 #301301

#제출 시각아이디문제언어결과실행 시간메모리
301301Gilgamesh슈퍼트리 잇기 (IOI20_supertrees)C++17
19 / 100
261 ms22392 KiB
#include "supertrees.h" #include <vector> const int mxN = 1000; using namespace std; int parent[mxN]; int rnk[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 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); } for(int i = 0; i < n; ++i){ parent[i] = i; } 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; } } 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; } } build(answer); 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...