Submission #864759

#TimeUsernameProblemLanguageResultExecution timeMemory
864759andrei_boacaConnecting Supertrees (IOI20_supertrees)C++17
100 / 100
206 ms34108 KiB
#include "supertrees.h"
#include <vector>
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;

int n;
vector<vector<int>> adj;
vector<int> muchii[1005],edges[1005];
int comp[1005],nrcomp;
bool use[1005];
vector<int> v,nodes;
bool good=1;
vector<vector<int>> P;
void calc(int nod)
{
    use[nod]=1;
    v.push_back(nod);
    for(int i:edges[nod])
        if(!use[i])
            calc(i);
}
void dfs(int nod)
{
    nodes.push_back(nod);
    comp[nod]=nrcomp;
    for(int i:muchii[nod])
        if(!comp[i])
            dfs(i);
}
void solve()
{
    for(int i:v)
        for(int j:v)
            if(P[i][j]==0)
            {
                good=0;
                return;
            }
    vector<int> reprez;
    for(int i:v)
        for(int j:v)
            if(i!=j&&P[i][j]==1)
                muchii[i].push_back(j);
    for(int i:v)
        if(comp[i]==0)
        {
            nrcomp++;
            nodes.clear();
            dfs(i);
            reprez.push_back(nodes[0]);
            for(int j=1;j<nodes.size();j++)
            {
                int a=nodes[j-1];
                int b=nodes[j];
                adj[a][b]=1;
                adj[b][a]=1;
            }
        }
    if(reprez.size()==2)
    {
        good=0;
        return;
    }
    int lg=reprez.size();
    for(int i=0;i<reprez.size();i++)
    {
        int a=reprez[i];
        int b=reprez[(i+1)%lg];
        if(a!=b)
            adj[a][b]=adj[b][a]=1;
    }
    for(int i:v)
        for(int j:v)
            if(i!=j)
            {
                if(P[i][j]==1&&comp[i]!=comp[j])
                {
                    good=0;
                    return;
                }
                if(P[i][j]==2&&comp[i]==comp[j])
                {
                    good=0;
                    return;
                }
            }
}
int construct(std::vector<std::vector<int>> p)
{
    P=p;
    good=1;
    n=p.size();
    adj.resize(n);
    for(int i=0;i<n;i++)
        adj[i].resize(n);
    bool sub1=1;
    bool sub2=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            sub1&=(p[i][j]<=2);
            if(p[i][j]>0&&i!=j)
                edges[i].push_back(j);
        }
    if(sub1)
    {
        for(int i=0;i<n;i++)
            if(!use[i])
            {
                v.clear();
                calc(i);
                solve();
                if(good==0)
                    return 0;
            }
        build(adj);
        return 1;
    }
	return 0;
}

Compilation message (stderr)

supertrees.cpp: In function 'void solve()':
supertrees.cpp:52:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |             for(int j=1;j<nodes.size();j++)
      |                         ~^~~~~~~~~~~~~
supertrees.cpp:66:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for(int i=0;i<reprez.size();i++)
      |                 ~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:98:10: warning: unused variable 'sub2' [-Wunused-variable]
   98 |     bool sub2=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...