#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define FOR for(int i=1;i<=n;i++)
#define lim 1005
vector<int> adj[lim];
int col[lim],vis[lim];
//~ void build(vector<vector<int>> v){
//~ for(auto a:v){
//~ for(auto b:a){
//~ cout<<b<<" ";
//~ }
//~ cout<<'\n';
//~ }
//~ }
inline void dfs(int node,int cur){
vis[node]=1;
col[node]=cur;
for(auto go:adj[node]){
if(vis[go])continue;
dfs(go,cur);
}
}
int construct(std::vector<std::vector<int>> p) {
int n = p.size();
std::vector<std::vector<int>> answer;
for (int i = 0; i < n; i++) {
std::vector<int> row;
row.resize(n,0);
answer.push_back(row);
for(int j=0;j<n;j++){
if(p[i][j]==1 && i!=j){
adj[i].pb(j);
}
}
}
int timer=0;
for(int i=0;i<n;i++){
if(vis[i])continue;
dfs(i,++timer);
}
for(int i=1;i<=timer;i++){
vector<int> tut;
for(int j=0;j<n;j++){
if(col[j]==i){
tut.pb(j);
}
}
for(int j=1;j<(int)tut.size();j++){
int node1=tut[i-1];
int node2=tut[i];
answer[node1][node2]=1;
answer[node2][node1]=1;
}
}
int stop=1;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(p[i][j]){
if(col[i]==col[j])continue;
stop=0;
break;
}
else{
if(col[i]==col[j])stop=0;
}
}
}
if(stop)build(answer);
return stop;
}
//~ int main(){
//~ int n;cin>>n;
//~ vector<vector<int>> gec;
//~ FOR{
//~ vector<int> tt;
//~ for(int j=0;j<n;j++){
//~ int x;cin>>x;
//~ tt.pb(x);
//~ }
//~ gec.pb(tt);
//~ }
//~ construct(gec);
//~ }