This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
const int k_N = 1000 + 3;
struct DSU{
int par[k_N], sz[k_N];
DSU(){
for(int i = 0; i < k_N; ++i){
par[i] = i;
sz[i] = 1;
}
}
int get_par(int x){
if(par[x] == x) return x;
return par[x] = get_par(par[x]);
}
bool unite(int x, int y){
if(get_par(x) == get_par(y))
return false;
if(sz[par[x]] < sz[par[y]])
swap(x, y);
par[par[y]] = par[x];
sz[par[x]] += sz[par[y]];
return true;
}
};
int construct(vector<vector<int>> p) {
int n = p.size();
vector<vector<int>> answer(n, vector<int>(n, 0));
DSU dsu;
for(int i = 0; i < n; ++i)
for(int j = i + 1; j < n; ++j)
if(p[i][j] == 3)
return 0;
for(int i = 0; i < n; ++i)
for(int j = i + 1; j < n; ++j)
if(p[i][j] == 1)
dsu.unite(i, j);
for(int i = 0; i < n; ++i)
for(int j = i + 1; j < n; ++j)
if(dsu.get_par(i) == dsu.get_par(j) && p[i][j] != 1)
return 0;
vector<int> roots;
for(int i = 0; i < n; ++i){
if(dsu.par[i] != i){
answer[i][dsu.par[i]] = 1;
answer[dsu.par[i]][i] = 1;
}
else roots.push_back(i);
}
//cout << "roots: ";
//for(int root: roots)
// cout << root << " ";
//cout << endl;
for(int i = 0; i < n; ++i)
for(int j = i + 1; j < n; ++j)
if(p[i][j] == 2)
dsu.unite(i, j);
for(int i = 0; i < n; ++i)
for(int j = i + 1; j < n; ++j)
if(dsu.get_par(i) == dsu.get_par(j) && !p[i][j])
return 0;
vector<bool> vis(roots.size(), false);
for(int i = 0; i < roots.size(); ++i){
if(vis[i]) continue;
int x = roots[i];
int curr = x, cnt = 1;
for(int j = i + 1; j < roots.size(); ++j){
if(vis[j]) continue;
int y = roots[j];
if(dsu.get_par(x) == dsu.get_par(y)){
vis[j] = true;
answer[curr][y] = 1;
answer[y][curr] = 1;
curr = y;
cnt++;
}
}
if(cnt == 2) return 0;
if(cnt == 1) continue;
answer[curr][x] = 1;
answer[x][curr] = 1;
}
build(answer);
return 1;
}
Compilation message (stderr)
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:83:22: 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 < roots.size(); ++i){
| ~~^~~~~~~~~~~~~~
supertrees.cpp:88:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | for(int j = i + 1; j < roots.size(); ++j){
| ~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |