제출 #730128

#제출 시각아이디문제언어결과실행 시간메모리
730128lucri슈퍼트리 잇기 (IOI20_supertrees)C++17
96 / 100
242 ms22428 KiB
#include "supertrees.h"
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <string>
int t[1010];
bool e[1010],dc[1010],ca[1010];
int tata(int nod)
{
    if(t[nod]==nod) return nod;
    return t[nod]=tata(t[nod]);
}
int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	std::vector<std::vector<int>> answer;
	answer.resize(n);
	for (int i = 0; i < n; i++) {
		t[i]=i;
		dc[i]=false;
		e[i]=true;
		answer[i].resize(n);
	}
	for(int i=0;i<n;++i)
    {
        if(p[i][i]!=1)
            return 0;
        for(int j=0;j<n;++j)
            if(p[i][j]==1)
            {
                if(tata(i)!=tata(j))
                {
                    answer[i][j]=answer[j][i]=1;
                    t[t[i]]=t[j];
                }
            }
    }
	for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
            if(p[i][j]==0)
            {
                if(tata(i)==tata(j))
                    return 0;
            }
    }
    for(int i=0;i<n;++i)
        if(e[i])
            for(int j=i+1;j<n;++j)
            {
                if(e[j])
                    if(tata(i)==tata(j))
                    {
                        e[j]=false;
                        for(int q=0;q<n;++q)
                            if(p[i][q]!=p[j][q])
                                return 0;
                    }
            }
    int ciclu[1010];
    for(int i=0;i<n;++i)
    {
        for(int q=0;q<n;++q)
            ca[q]=false;
        ca[i]=true;
        if(e[i]==true&&dc[i]==false)
        {
            ciclu[0]=1;
            ciclu[1]=i;
            for(int j=0;j<n;++j)
                if(e[j]&&p[i][j]==2)
                {
                    ciclu[++ciclu[0]]=j;
                    ca[j]=true;
                }
            if(ciclu[0]>2)
            {
                for(int ii=1;ii<ciclu[0];++ii)
                {
                    dc[ciclu[ii]]=true;
                    answer[ciclu[ii]][ciclu[ii+1]]=answer[ciclu[ii+1]][ciclu[ii]]=1;
                    for(int q=0;q<n;++q)
                    {
                        if(e[q]&&q!=ciclu[ii])
                            if(ca[q]==false&&p[ciclu[ii]][q]==2||ca[q]==true&&p[ciclu[ii]][q]!=2)
                                return 0;
                    }
                }
                answer[ciclu[ciclu[0]]][ciclu[1]]=answer[ciclu[1]][ciclu[ciclu[0]]]=1;
            }
            else if(ciclu[0]==2)
                return 0;
        }
    }
	build(answer);
	return 1;
}

컴파일 시 표준 에러 (stderr) 메시지

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:85:44: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   85 |                             if(ca[q]==false&&p[ciclu[ii]][q]==2||ca[q]==true&&p[ciclu[ii]][q]!=2)
      |                                ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
#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...