Submission #1197623

#TimeUsernameProblemLanguageResultExecution timeMemory
1197623ivazivaConnecting Supertrees (IOI20_supertrees)C++20
0 / 100
1096 ms26184 KiB
#include <bits/stdc++.h>
#include <vector>
#include "supertrees.h"

using namespace std;

#define MAXN 1001

int N;
int a[MAXN][MAXN];
int parent[MAXN],siz[MAXN];
vector<vector<int>> adj;
set<int> compparents[2];
vector<int> korenovi;

int get(int node)
{
    if (parent[node]==node) return node;
    return get(parent[node]);
}

int construct(std::vector<std::vector<int>> p)
{
    N=p.size();adj.resize(N);
    for (int i=0;i<N;i++)
    {
        parent[i]=i;siz[i]=1;adj[i].resize(N);
        for (int j=0;j<N;j++) {a[i][j]=p[i][j];adj[i][j]=0;}
    }
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<N;j++)
        {
            if (a[i][j]!=a[j][i]) return 0;
            if (a[i][j]==3) return 0;
            for (int k=0;k<N;k++)
            {
                if (a[i][j]==1 and a[j][k]==1 and a[i][k]!=1) return 0;
                if (a[i][j]!=0 and a[j][k]!=0 and a[i][k]==0) return 0;
            }
        }
    }
    for (int node=0;node<N;node++)
    {
        int korennode=get(node);
        for (int sled=0;sled<N;sled++)
        {
            if (a[node][sled]!=1) continue;
            int korensled=get(sled);if (korensled==korennode) continue;
            if (siz[korennode]<siz[korensled]) swap(korennode,korensled);
            parent[korensled]=korennode;siz[korennode]+=siz[korensled];
            adj[korennode][korensled]=adj[korensled][korennode]=1;
        }
    }
    for (int node=0;node<N;node++)
    {
        if (parent[node]==node) {compparents[0].insert(node);compparents[1].insert(node);}
    }
    for (int node:compparents[0])
    {
        if (compparents[1].find(node)==compparents[1].end()) continue;
        korenovi.push_back(node);
        for (int sled:compparents[1])
        {
            if (sled==node) continue;
            if (a[node][sled]==2) korenovi.push_back(sled);
        }
        for (int koren:korenovi) compparents[1].erase(koren);
        if (korenovi.size()==2) return 0;
        for (int siz=0;siz<korenovi.size()-1;siz++) {int node1=korenovi[siz],node2=korenovi[siz+1];adj[node1][node2]=adj[node2][node1]=1;}
        int node1=korenovi[0],node2=korenovi[korenovi.size()-1];adj[node1][node2]=adj[node2][node1]=1;korenovi.clear();
        if (compparents[1].empty()) break;
    }
    for (int i=0;i<N;i++) adj[i][i]=0;
    build(adj);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...