# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
429369 | Dan4Life | Connecting Supertrees (IOI20_supertrees) | C++17 | 0 ms | 0 KiB |
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;
vector<int> v;
vector<vector<int>> a;
bool vis[1001];
#define pb push_back
int N;
void dfs(int s, int x)
{
v.pb(s); vis[s]=true;
for(int i = 0; i < N; i++)
if(!vis[i] and a[s][i]==x) dfs(i, x);
}
int construct(vector<vector<int>> p) {
for(auto u : p)
for(auto v : u)
if(v==3)return 0;
N = p.size(), fill(vis,vis+1000,false);
for(auto u : p)
{
vector<int> x; x.clear();
for(auto v : u) x.pb(v);
a.pb(x);
}
vector<vector<int>> answer;
vector<int> x; x.clear();
for(int j = 0; j < N; j++)x.pb(0);
for(int i = 0; i < N; i++)
answer.pb(x);
for(int i = 0; i < N; i++)
{
if(vis[i])continue; v.clear();
dfs(i, 1);
for(int j = 0; j < v.size()-1; j++)
{
if(p[v[j]][v[j+1]==0)return 0;
answer[v[j]][v[j+1]]=1;
}
}
fill(vis,vis+1000,false);
for(int i = 0; i < N; i++)
{
if(vis[i])continue; v.clear();
dfs(i, 2); if(v.size()<=1)continue;
if(v.size()<=2)return 0;
for(int j = 0; j < v.size(); j++)
{
if(p[v[j]][v[(j+1)%(int)v.size()]==0)return 0;
answer[v[j]][v[(j+1)%(int)v.size()]]=1;
}
}
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(answer[i][j]==1) answer[j][i]=1;
build(answer);
return 1;
}