#include "supertrees.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
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);
answer.push_back(row);
}
if(n==1){
answer[0][0] = 0;
build(answer);
return 1;
}
int count = 0;
int zerocount = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(p[i][j] == 1){
count++;
}
else if(p[i][j] == 0){
zerocount++;
}
}
}
if(zerocount == (n*n)-n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
answer[i][j] = 0;
}
}
build(answer);
return 1;
}
//subtask 1
if(count == n*n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
answer[i][j] = 0;
}
}
for(int i = 1; i < n; i++){
answer[i][0] = 1;
answer[0][i] = 1;
}
build(answer);
return 1;
}
//subtask 2
count = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(p[i][j] <= 1){
count++;
}
}
}
if(count == n*n){
vector<int> arr(n, 0);
vector<int> arr2;
int arr2size;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
answer[i][j] = 0;
}
}
int currentIndex = 0;
while(currentIndex != n){
if(!arr[currentIndex]){
arr2.push_back(currentIndex);
for(int i = 0; i < n; i++){
if(p[currentIndex][i]){
if(arr[i]){
return 0;
}
answer[currentIndex][i] = 1;
answer[i][currentIndex] = 1;
if(currentIndex != i){
arr[i]++;
}
arr2.push_back(i);
}
}
arr2size = arr2.size();
for(int k = 0; k < arr2size-1; k++){
for(int m = k+1; m < arr2size; m++){
if(!p[arr2[k]][arr2[m]]){
return 0;
}
}
}
for(int k = 0; k < arr2size; k++){
for(int m = 0; m < n; m++){
if(p[arr2[k]][m]){
if(find(arr2.begin(), arr2.end(), m) == arr2.end()){
return 0;
}
}
}
}
arr[currentIndex]++;
arr2.clear();
}
currentIndex++;
}
for(int i = 0 ; i < n; i++){
if(arr[i] > 1){
return 0;
}
}
for(int i = 0; i < n; i++){
answer[i][i] = 0;
}
build(answer);
return 1;
}
//subtask 3
count = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(p[i][j] == 0 || p[i][j] == 2){
count++;
}
}
}
if(count == (n*n)-n){
if(n==2){
return 0;
}
vector<int> arr(n, 0);
vector<int> arr2;
int arr2size;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
answer[i][j] = 0;
}
}
int currentIndex = 0;
while(currentIndex != n){
if(!arr[currentIndex]){
arr2.push_back(currentIndex);
for(int i = 0; i < n; i++){
if(p[currentIndex][i]){
if(arr[i]){
return 0;
}
if(currentIndex != i){
arr[i]++;
arr2.push_back(i);
}
}
}
arr2size = arr2.size();
if(arr2size > 2){
answer[arr2[0]][arr2[arr2size-1]] = 1;
answer[arr2[arr2size-1]][arr2[0]] = 1;
for(int k = 0; k < arr2size-1; k++){
answer[arr2[k]][arr2[k+1]] = 1;
answer[arr2[k+1]][arr2[k]] = 1;
}
}
else if(arr2size == 2){
return 0;
}
for(int k = 0; k < arr2size-1; k++){
for(int m = k+1; m < arr2size; m++){
if(!p[arr2[k]][arr2[m]]){
return 0;
}
}
}
for(int k = 0; k < arr2size; k++){
for(int m = 0; m < n; m++){
if(p[arr2[k]][m]){
if(find(arr2.begin(), arr2.end(), m) == arr2.end()){
return 0;
}
}
}
}
arr[currentIndex]++;
arr2.clear();
}
currentIndex++;
}
for(int i = 0 ; i < n; i++){
if(arr[i] > 1){
return 0;
}
}
for(int i = 0; i < n; i++){
answer[i][i] = 0;
}
build(answer);
return 1;
}
//subtask 4
count = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(p[i][j] <= 2){
count++;
}
}
}
if(count == n*n){
vector<int> arr(n, 0);
vector<int> arr2;
int arr2size;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
answer[i][j] = 0;
}
}
int currentIndex = 0;
//0 or 1 part
while(currentIndex != n){
if(!arr[currentIndex]){
for(int i = 0; i < n; i++){
if(p[currentIndex][i] == 1){
answer[currentIndex][i] = 1;
answer[i][currentIndex] = 1;
if(currentIndex != i){
arr[i]++;
}
}
}
arr[currentIndex] = 1;
}
currentIndex++;
}
for(int i = 0; i < n; i++){
answer[i][i] = 0;
}
build(answer);
return 1;
}
currentIndex = 0;
arr.resize(n, 0);
while(currentIndex != n){
if(!arr[currentIndex]){
arr2.push_back(currentIndex);
for(int i = 0; i < n; i++){
if(p[currentIndex][i] == 2){
if(currentIndex != i){
arr[i]++;
arr2.push_back(i);
}
}
}
arr2size = arr2.size();
if(arr2size>2){
answer[arr2[0]][arr2[arr2size-1]] = 1;
answer[arr2[arr2size-1]][arr2[0]] = 1;
for(int k = 0; k < arr2size-1; k++){
answer[arr2[k]][arr2[k+1]] = 1;
answer[arr2[k+1]][arr2[k]] = 1;
}
}
arr[currentIndex]++;
arr2.clear();
}
currentIndex++;
}
build(answer);
return 1;
}
Compilation message
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:264:7: warning: unused variable 'arr2size' [-Wunused-variable]
264 | int arr2size;
| ^~~~~~~~
supertrees.cpp:311:2: error: 'currentIndex' was not declared in this scope
311 | currentIndex = 0;
| ^~~~~~~~~~~~
supertrees.cpp:312:9: error: 'arr' was not declared in this scope
312 | arr.resize(n, 0);
| ^~~
supertrees.cpp:319:5: error: 'arr2' was not declared in this scope
319 | arr2.push_back(currentIndex);
| ^~~~
supertrees.cpp:331:5: error: 'arr2size' was not declared in this scope
331 | arr2size = arr2.size();
| ^~~~~~~~