Submission #1145935

#TimeUsernameProblemLanguageResultExecution timeMemory
1145935AlgorithmWarriorConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
135 ms22216 KiB
#include <bits/stdc++.h>
#include <vector>
#define MAX 1005

using namespace std;

vector<int>team_type1[MAX];
int N;
int nbt[MAX];
bool vis[MAX];
vector<vector<int>>answer;

void myfill2(int nod,vector<int>&nodes,vector<int>&put_val,vector<vector<int>>&p)
{
    put_val.push_back(nod);
    vis[nod]=1;
    for(auto el : nodes)
        if(p[nod][el]==1 && !vis[el])
            myfill2(el,nodes,put_val,p);
}

bool solve_connected_component(vector<int>&nodes,vector<vector<int>>&p)
{
    vector<int>put_val;
    int i;
    int primul=-1,ult=-1;
    int cnt=0;
    for(auto el : nodes)
        if(!vis[el])
        {
            ++cnt;
            myfill2(el,nodes,put_val,p);
            for(auto el1 : put_val)
                for(auto el2 : put_val)
                    if(p[el1][el2]==2)
                        return 0;
            for(i=1;i<put_val.size();++i)
                answer[put_val[i-1]][put_val[i]]=answer[put_val[i]][put_val[i-1]]=1;
            if(primul>-1)
            {
                answer[ult][put_val[0]]=answer[put_val[0]][ult]=1;
                ult=put_val[0];
            }
            else
                primul=ult=put_val[0];
            put_val.clear();
        }
    /// VERIFICA CNT SA NU FIE 2
    if(cnt==2)
        return 0;
    if(primul!=ult)
        answer[primul][ult]=answer[ult][primul]=1;
    return 1;
}

void myfill(int nod,vector<vector<int>>&path,int nbteam)
{
    team_type1[nbteam].push_back(nod);
    nbt[nod]=nbteam;
    int i;
    for(i=0;i<N;++i)
        if(!nbt[i] && path[i][nod])
            myfill(i,path,nbteam);
}

void debug()
{
    int i,j;
    for(i=0;i<N;++i){
        for(j=0;j<team_type1[i].size();++j)
            cout<<team_type1[i][j]<<' ';
        cout<<'\n';
    }
}

bool check_type_1(vector<vector<int>>&p)
{
    int i,j;
    for(i=0;i<N;++i)
        for(j=0;j<N;++j)
            if(!p[i][j] && nbt[i]==nbt[j])
                return 0;
    return 1;
}

void build(vector<vector<int>>b);

int construct(vector<vector<int>>p)
{
    int i,j;
    N=p[0].size();
    for(i=0;i<N;++i)
        for(j=0;j<N;++j)
            if(p[i][j]==3)
                return 0;
    answer.resize(N);
    for(i=0;i<N;++i)
        answer[i].resize(N);
    int team=0;
    for(i=0;i<N;++i)
        if(!nbt[i])
            myfill(i,p,++team);
    if(!check_type_1(p))
        return 0;
    for(i=1;i<=team;++i)
        if(!solve_connected_component(team_type1[i],p))
            return 0;
    build(answer);
    return 1;
}

/*
int main()
{
    int NN;
    cin>>NN;
    vector<vector<int> >mat;
    mat.resize(NN);
    int i;
    for(i=0;i<NN;++i)
        mat[i].resize(NN);
    int j;
    for(i=0;i<NN;++i)
        for(j=0;j<NN;++j)
            cin>>mat[i][j];
    cout<<construct(mat);
    return 0;
}
*/
#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...