제출 #804314

#제출 시각아이디문제언어결과실행 시간메모리
804314WarinchaiConnecting Supertrees (IOI20_supertrees)C++14
19 / 100
197 ms27972 KiB
#include "supertrees.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std;
int sz;
vector<vector<int> >v;
vector<vector<int> >ans;
int pr[1005];
int in[1005];
int fp(int a){
    if(pr[a]==a){
        return a;
    }
    return pr[a]=fp(pr[a]);
}
void un(int a,int b){
    if(fp(a)!=fp(b)){
        ans[a][b]=1;
        ans[b][a]=1;
        pr[fp(b)]=fp(a);
    }
}
bool build_1(){
    for(int i=0;i<sz;i++){
        for(int j=i+1;j<sz;j++){
            if(v[i][j]==1){
                un(i,j);
            }
        }
    }
    return 1;
}
int use_2[1005];
bool build_2(){
    for(int i=0;i<sz;i++){
        if(in[i]==1){
            for(int j=0;j<sz;j++){
                if(v[i][j]==2&&fp(i)!=fp(j)){
                    return 0;
                }
                if(v[i][j]==0&&fp(i)==fp(j)){
                    return 0;
                }
            }
            continue;
        }
        int en=i;
        int count=0;
        for(int j=0;j<sz;j++){
            if(v[i][j]==2){
                if(in[j]==1){
                    return 0;
                }
                un(en,j);
                in[en]=1;
                in[j]=1;
                en=j;
                count++;
            }
        }
        if(count==1){
            return 0;
        }
        if(count!=0){
            ans[i][en]=1;
            ans[en][i]=1;
        }
    }
    return 1;
}
bool check_0(){
    for(int i=0;i<sz;i++){
        for(int j=i+1;j<sz;j++){
            if(v[i][j]==0&&fp(i)==fp(j))return 0;
        }
    }
    return 1;
}
int construct(vector<vector<int> > p) {
    //cout<<"work"<<endl;
	sz = p.size();
    bool check=0;
    v.resize(sz);
    for(int i=0;i<sz;i++){
        v[i].resize(sz);
    }
    for(int i=0;i<sz;i++){
        for(int j=0;j<sz;j++){
            //cout<<"i j "<<i<<" "<<j<<endl;
            v[i][j]=p[i][j];
            if(p[i][j]!=p[j][i]||(i==j&&p[i][j]!=1)){
                check=1;
                //cout<<"break"<<endl;
                break;
            }
        }
    }
    //cout<<"work"<<endl;
    if(check){
        return 0;
    }
    //cout<<"work"<<endl;
    ans.resize(sz);
    for(int i=0;i<sz;i++){
        ans[i].resize(sz);
    }
    for(int i=0;i<sz;i++){
        pr[i]=i;
    }
    //cout<<"work"<<endl;
    if(!build_2()){
        //cout<<"break 2"<<endl;
        return 0;
    }
    /*if(!build_1()){
        cout<<"break 1"<<endl;
        return 0;
    }*/
    if(!check_0()){
        //cout<<"break 0";
        return 0;
    }else{
        build(ans);
    }
	//cout<<"ans:"<<endl;
	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...