제출 #828648

#제출 시각아이디문제언어결과실행 시간메모리
828648Mularstyle슈퍼트리 잇기 (IOI20_supertrees)C++14
100 / 100
174 ms24192 KiB
#include "supertrees.h"
#include <vector>
#include<bits/stdc++.h>
#define ll long long

using namespace std;
int C1[1008],C2[1008],P[1008];
bool vis[1008];
//int V[1008][1008];
vector<std::vector<int>> A;
void added(int u,int v)
{
    if(u==-1||v==-1)
        return;
    if(u==v)
        return;
    A[u][v]=1;
    A[v][u]=1;
    return;
}


int construct(std::vector<std::vector<int>> p) {
	int n = p.size();

	int cnt=0;
    A.resize(n);
    for(int i=0;i<n;i++)
    {
        A[i].resize(n);
        for(int j=0;j<n;j++)
            A[i][j]=0;
    }
    for(int i=0;i<n;i++)
    {
        if(C1[i]==0)cnt++;
        else continue;
        for(int j=0;j<n;j++)
        {
            if(p[i][j])
                C1[j]=cnt;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if((C1[i]==C1[j])^(p[i][j]!=0))
                return 0;//impos
            if(p[i][j]==3)
                return 0;//impos
        }
    }
    vector<int> com;
    cnt=0;
    for(int i=0;i<n;i++)
        P[i]=-1;

    for(int i=0;i<n;i++)
    {
        if(C2[i]==0)cnt++;
        else continue;
        com.push_back(i);
        for(int j=0;j<n;j++)
        {
            if(p[i][j]==1)
            {
                P[j]=i;
                C2[j]=cnt;
            }
        }
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i==j)continue;
            if((p[i][j]==1)^(C2[i]==C2[j]))
                return 0;//impos
        }
    }

    for(int i=0;i<n;i++)
    {
        added(i,P[i]);
    }

    for(auto c:com)
    {
        vector<int> sub;
        if(vis[c])continue;
        for(auto s:com)
        {
            if(C1[c]==C1[s]&&!vis[s])
                sub.push_back(s);
        }

    for(auto s:sub)
        vis[s]=true;
    int siz=sub.size();
    if(siz==2)
        return 0;//impos
    if(siz>1)
    {
        for(int i=0;i<siz;i++)
            added(sub[i],sub[(i+1)%siz]);
    }
    }
    build(A);
    return 1;//possible
}
#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...