# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1063344 | 2024-08-17T17:04:33 Z | jamjanek | Connecting Supertrees (IOI20_supertrees) | C++14 | 0 ms | 0 KB |
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; int father1[1010], father[1010], father3[1010]; int find1(int x){ if(father1[x]==x)return x; return father1[x] = find1(father1[x]); } int find2(int x){ if(father[x]==x)return x; return father[x] = find2(father[x]); } vector<int>cykle[1010]; int construct(std::vector<std::vector<int>> p) { int n = p.size(), i, j; for(i=0;i<n;i++)father[i] = father1[i] = i; std::vector<std::vector<int>> answer = p; for(i=0;i<n;i++) for(j=0;j<n;j++) answer[i][j] = 0; for(i=0;i<n;i++) for(j=0;j<n;j++){ if(p[i][j]==3 || (i==j && p[i][j]!=1) || (p[i][j]!=p[j][i])) return 0; if(p[i][j]>0) father1[find1(i)] = find1(j); if(p[i][j]==1 && find2(i)!=find2(j)){ father[find2(i)] = find2(j); answer[i][j] = answer[j][i] = 1; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(p[i][j]==0 && find1(i)==find1(j))return 0; if(p[i][j]>0 && find1(i)!=find1(j))return 0; } } for(i=0;i<n;i++) for(j=0;j<n;j++) if(p[i][j]==2 && find2(i)==find2(j)) return 0; for(i=0;i<n;i++) if(find2(i)==i){ int mini = i; bool czy = 0; for(j=0;j<i;j++) if(p[i][j]==2) czy = 1; for(j=0;j<i;j++) if(p[i][j]==2 &&/* find2(j)==j */&& j<mini){ mini = j; } assert(mini==i); if(mini!=i) cykle[mini].push_back(i); } bool gowno = 1; for(i=0;i<n;i++) if(cykle[i].size()!=0) gowno = 0; assert(gowno); for(int j=0;j<n;j++){ if(cykle[j].size()==1)return 0; if(cykle[j].size())cykle[j].push_back(j); assert(cykle[j].size()>2 || cykle[j].size()==0); for(i=0;i<(int)cykle[j].size();i++){ int mod = cykle[j].size(); answer[cykle[j][i]][cykle[j][(i+1)%mod]] = 1; answer[cykle[j][(i+1)%mod]][cykle[j][i]] = 1; } } build(answer); return 1; }