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<bits/stdc++.h>
using namespace std;
#include "supertrees.h"
#define N 1005
int p[N],pp[N];
vector<int> v;
vector<vector<int>> a,b;
bitset<N> vis,ch;
int fp(int v){return (v==p[v])?v:p[v]=fp(p[v]);}
int fpp(int v){return (v==pp[v])?v:pp[v]=fpp(pp[v]);}
bool sol(int n){
int i,j,cy=0,head,num;
vector<int> gr[N],u;
ch=0;
iota(pp,pp+n,0);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
num=a[v[i]][v[j]];
if(num==1){
if(fpp(i)!=fpp(j))pp[fpp(i)]=fpp(j);
}
else if(!cy){
cy=num;
}
else if(cy!=num)return false;
}
}
for(i=0;i<n;i++)gr[fpp(i)].push_back(v[i]);
if(!cy){
for(i=1;i<n;i++)b[v[i]][v[i-1]]=b[v[i-1]][v[i]]=1;
return true;
}
else{
for(i=0;i<n;i++){
if(ch[fpp(i)])continue;
head=fpp(i);
u.push_back(v[head]);
ch[head]=true;
for(auto x:gr[head]){
for(j=0;j<n;j++){
if(fpp(j)==head){
if(a[x][v[j]]!=1)return false;
}
else{
if(a[x][v[j]]!=cy)return false;
}
}
}
}
for(i=0;i<n;i++)
for(j=1;j<gr[i].size();j++)b[gr[i][j]][gr[i][j-1]]=b[gr[i][j-1]][gr[i][j]]=1;
if(u.size()<3)return false;
for(i=1;i<u.size();i++)b[u[i]][u[i-1]]=b[u[i-1]][u[i]]=1;
b[u[0]][u.back()]=b[u.back()][u[0]]=1;
return true;
}
}
int construct(vector<vector<int>> input) {
a=input;
int n=a.size(),i,j,m;
bool flag;
iota(p,p+n,0);
for(i=0;i<n;i++){
b.push_back({});
b[i].resize(n);
for(j=0;j<n;j++){
if(a[i][j]==3)return 0;
if(a[i][j]){
if(fp(i)==fp(j))continue;
p[fp(i)]=fp(j);
}
else if(fp(i)==fp(j))return 0;
}
}
for(i=0;i<n;i++){
if(!vis[fp(i)]){
vis[fp(i)]=true;
for(j=0;j<n;j++)if(fp(i)==fp(j))v.push_back(j);
m=v.size();
flag=sol(m);
v.clear();
if(!flag)return 0;
}
}
build(b);
return 1;
}
Compilation message (stderr)
supertrees.cpp: In function 'bool sol(int)':
supertrees.cpp:55:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
55 | for(j=1;j<gr[i].size();j++)b[gr[i][j]][gr[i][j-1]]=b[gr[i][j-1]][gr[i][j]]=1;
| ~^~~~~~~~~~~~~
supertrees.cpp:57:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
57 | for(i=1;i<u.size();i++)b[u[i]][u[i-1]]=b[u[i-1]][u[i]]=1;
| ~^~~~~~~~~
# | 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... |