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>
#include "supertrees.h"
using namespace std;
void dfs(int head, vector<vector<int>> &arr, vector<int> &vis, vector<vector<int>> &path, int N, vector<int> &col, int c){
    vis[head] = true;
    col[head] = c;
    for(int i = 0; i < N; i ++){
        if(!vis[i] && arr[head][i] == 1){
            path[i][head] = 1;
            path[head][i] = 1;
            dfs(i, arr, vis, path, N, col, c);
        }
    }
}
void dfs2(int head, vector<vector<int>> &path, int N, int &e, vector<int> &vis, vector<vector<int>> &arr, vector<int> &col){
    vis[head] = true;
    for(int i = 0; i < N; i ++){
        if(col[i] == col[head]){
            vis[i] = true;
        }
    }
    e = head;
    for(int i = 0; i < N; i ++){
        if(!vis[i] && arr[head][i] == 2){
            int c = col[i];
            for(int j = 0; j < N; j ++){
                if(col[j] == c){
                    col[j] = col[head];
                }
            }
            path[i][head] = 1;
            path[head][i] = 1;
            dfs2(i, path, N, e, vis, arr, col);
        }
    }
}
int construct(vector<vector<int>> arr){
    int N = arr.size();
    vector<int> vis(N, 0), col(N, -1);
    bool pos = true;
    vector<vector<int>> path(N, vector<int>(N));
    int c = 1;
    for(int i = 0; i < N; i ++){
        if(!vis[i]){
            dfs(i, arr, vis, path, N, col, c++);
        }
    }
    fill(vis.begin(), vis.end(), 0);
    for(int i = 0; i < N; i ++){
        if(!vis[i] && *max_element(arr[i].begin(), arr[i].end()) == 2){
            int t = -1;
            dfs2(i, path, N, t, vis, arr, col);
            if(path[i][t]){
                pos = false;
            }
            path[i][t] = 1;
            path[t][i] = 1;
        }
    }
    for(int i = 0; i < N; i ++){
        for(int j = 0; j < N; j ++){
            if(arr[i][j] == 0 && col[i] == col[j]){
                pos = false;
            }
            if(arr[i][j] == 3){
                pos = false;
            }
        }
    }
    if(pos)
    build(path);
    return pos;
}
| # | 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... |