#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
#define emb emplace_back
const int maxn = 1005;
int construct(vector<vector<int>> p){
int n = p.size();
vector<vector<int>> res(n, vector<int>(n));
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(p[i][j] == 3) return 0;
}
}
for(int s=0;s<n;++s){
if((s == 0 || p[0][s] == 0)){
vector<int> o, t;
bool vis[n] = {};
o.emb(s);
for(int i=0;i<o.size();++i){
int u = o[i];
vis[u] = 1;
for(int j=0;j<n;++j){
//cout << u << " " << j << "\n";
if(vis[j]) continue;
if(p[u][j] == 1){
vis[j] = 1;
o.emb(j);
}
}
}
for(int i=1;i<o.size();++i){
int u = o[i], v = o[i-1];
res[u][v] = res[v][u] = 1;
}
for(auto u : o){
for(auto v : o){
if(u == v) continue;
if(p[u][v] != 1) return 0;
}
}
for(auto u : o){
for(int i=0;i<n;++i){
if(vis[i]) continue;
if(p[u][i] == 2){
vis[i] = 1;
t.emb(i);
}
}
}
if(t.size() == 0) continue;
else if(t.size() == 1) return 0;
for(auto u : t){
for(auto v : t){
if(u == v) continue;
if(p[u][v] != 2) return 0;
}
}
for(auto u : o){
for(auto v : t){
if(p[u][v] != 2) return 0;
}
}
for(int i=1;i<t.size();++i){
int u = t[i], v = t[i-1];
res[u][v] = res[v][u] = 1;
}
res[t.front()][t.back()] = res[t.back()][t.front()] = 1;
res[o[0]][t[0]] = res[t[0]][o[0]] = 1;
if(t.size() == 2) res[o[0]][t.back()] = res[t.back()][o[0]] = 1;
//for(auto e : o) cout << e << " ";
//cout << "\n";
//for(auto e : t) cout << e << " ";
//cout << "\n";
}
}
build(res);
return 1;
}