Submission #519874

#TimeUsernameProblemLanguageResultExecution timeMemory
519874A_DConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
243 ms28220 KiB
#include "supertrees.h"
#include <bits/stdc++.h>

using namespace std;
const int N=1e3+110;
vector<int> g1[N];
vector<int> g2[N];
int vis[N];
int vis2[N];
vector<vector<int>> answer;
vector<int> vec;
vector<int> g[N];

void dfs(int u)
{
    vis[u]=1;
    for(auto x:g[u]){
        if(vis[x]){
            continue;
        }
        vec[x]++;
        vis[x]=1;
        dfs(x);
        vis[x]=0;
    }
}

int construct(vector<vector<int>> p){
	int n = p.size();
	vector<int> tmp(n);
	for(int i=0;i<n;i++){
        answer.push_back(tmp);
	}

	for(int i=0;i<n;i++){
        g1[i].push_back(i);
        g2[i].push_back(i);
        for(int j=i;j<n;j++){
            int v=p[i][j];
            if(v==3||(i==j&&v!=1)||p[i][j]!=p[j][i]){
                return 0;
            }
            if(v==2){
                g2[i].push_back(j);
                g2[j].push_back(i);

            }
            if(v==1&&i!=j){
                g1[i].push_back(j);
                g1[j].push_back(i);
            }
        }
	}
	for(int i=0;i<n;i++){
        sort(g1[i].begin(),g1[i].end());
        sort(g2[i].begin(),g2[i].end());
	}
	int cnt=0;
	for(int i=0;i<n;i++){
        if(vis[i]==0){
            cnt++;
            int sz=g1[i].size();
            vis[g1[i][0]]=cnt;
            for(int j=0;j<sz-1;j++){
                vis[g1[i][j]]=cnt;
                vis[g1[i][j+1]]=cnt;
                answer[g1[i][j]][g1[i][j+1]]=1;
                answer[g1[i][j+1]][g1[i][j]]=1;
                if(g1[g1[i][j]]!=g1[g1[i][j+1]])return 0;
            }
        }
	}
	for(int i=0;i<n;i++){
        if(vis2[vis[i]]==0){
            vis2[vis[g2[i][0]]]=1;
            int sz=g2[i].size();
            int lst=g2[i][0];
            for(int j=0;j<sz-1;j++){

            }
            for(int j=1;j<sz;j++){
                if(vis2[vis[g2[i][j]]]==0){
                    vis2[vis[g2[i][j]]]=1;
                    answer[lst][g2[i][j]]=1;
                    answer[g2[i][j]][lst]=1;
                 //   if(g2[g2[i][j]]!=g2[lst])return 0;
                    lst=g2[i][j];
                }
            }
            answer[lst][g2[i][0]]=1;
            answer[g2[i][0]][lst]=1;
        }
	}
    for(int i=0;i<n;i++){
        answer[i][i]=0;
    }
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(answer[i][j]){
                g[i].push_back(j);
                g[j].push_back(i);
            }
        }
    }
    for(int i=0;i<n;i++){
        memset(vis,0,sizeof(vis));
        vec.clear();
        vec.resize(n);
        dfs(i);
        vec[i]=1;
//        for(auto x:vec)cout<<x<<" ";cout<<endl;
        if(vec!=p[i])return 0;
    }
	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...