Submission #1136602

#TimeUsernameProblemLanguageResultExecution timeMemory
1136602bestbestConnecting Supertrees (IOI20_supertrees)C++20
56 / 100
133 ms26124 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
#define  en '\n'
#define  sp ' '
const int N=1000;

int par[N],chk[N][N],vis[N],branch[N];
map<int,vector<int>> m,l;


int find(int a){
	if(a!=par[a])return par[a]=find(par[a]);
	return par[a];
}

int construct(vector<vector<int>> p) {


	int n = p.size();
	vector<vector<int>> answer;

    for (int i = 0; i < n; i++) {
		vector<int> row;
		row.resize(n);
		answer.push_back(row);
	}


    for(int i=0;i<N;i++)par[i]=i;

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(p[i][j]==3)return 0;
            else if(p[i][j]){
                par[find(i)]=par[find(j)];
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(par[find(i)]==par[find(j)] && !p[i][j])return 0;
            else if(par[find(i)]!=par[find(j)] && p[i][j])return 0;
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)chk[i][j]=0;
    }

    for(int i=0;i<n;i++){
        m[par[i]].push_back(i);
    }

    for(int i=0;i<n;i++)par[i]=i;

    vector<int> v;
    set<vector<int>> s;
    for(auto [k,u]:m){
        for(int i=0;i<u.size();i++){
            for(int j=0;j<u.size();j++){
                //if(p[u[i]][u[j]]==2 && par[find(u[i])]==par[find(u[j])])return 0;
                //else 
                if(p[u[i]][u[j]]==1){
                    par[find(u[i])]=par[find(u[j])];
                }
                // else if(p[u[i]][u[j]]==2 && (chk[u[i]][u[j]]==0 || chk[u[i]][u[j]]==-1)){
                //     chk[u[i]][u[j]]=-1;
                // }
                // else return 0;
            }
            
        }
        
        for(int i=0;i<u.size();i++){
            for(int j=0;j<u.size();j++){
                if(p[u[i]][u[j]]==1 && par[find(u[i])]!=par[find(u[j])])return 0;
                else if(p[u[i]][u[j]]==2 && par[find(u[i])]==par[find(u[j])])return 0;
            }
            
        }

        l.clear();

        for(int i=0;i<u.size();i++){
            l[par[u[i]]].push_back(u[i]);
        }

        vector<int> c;
        for(auto [j,v]:l){
            c.push_back(j);
            for(auto i:v){
                if(i!=j)answer[j][i]=answer[i][j]=1;
            }
        }

        for(int i=0;i<c.size();i++){
            if(i!=(i+1)%c.size())answer[c[i]][c[(i+1)%c.size()]]=answer[c[(i+1)%c.size()]][c[i]]=1;
        }

    }

	build(answer);
	return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...