제출 #1284578

#제출 시각아이디문제언어결과실행 시간메모리
1284578Rares슈퍼트리 잇기 (IOI20_supertrees)C++20
56 / 100
100 ms26164 KiB
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;
/**ifstream fin ("date.in");
ofstream fout ("date.out");
#define cin fin
#define cout fout**/

const int MAXN=1010;

/**void build (vector <vector <int>> b){
    int n=b.size ();
    for (int i=0;i<n;++i){
        for (int j=0;j<n;++j){
            cout <<b[i][j]<<' ';
        }
        cout <<'\n';
    }
}**/

int n,maxx,tata[MAXN];
bool v[MAXN];
vector <int> crt;
vector <vector <int>> rez,p;

void dfs (int node){
    v[node]=1;
    crt.push_back (node);
    for (int i=0;i<n;++i){
        if (i!=node and p[node][i] and v[i]==0){
            maxx=max (maxx,p[node][i]);
            dfs (i);
        }
    }
}

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

    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]!=p[j][i]) return 0;
            if (p[i][j]==3) return 0;
        }
    }
    for (int i=0;i<n;++i) tata[i]=-1;

    rez.resize (n, vector <int> (n,0));
    for (int i=0;i<n;++i){
        if (v[i]==0){
            ///am o componenta conexa noua pe care o rezolv
            crt.clear ();
            maxx=0;
            dfs (i);

            if (maxx==0) continue;///am un nod izolat
            if (maxx==1){
                ///verific ca de la fiecare la fiecare sa am 1
                for (auto x:crt){
                    for (auto y:crt){
                        if (p[x][y]==0) return 0;
                    }
                }
                ///am un lant
                for (int j=0;j<crt.size ()-1;++j){
                    rez[crt[j]][crt[j+1]]=1;
                    rez[crt[j+1]][crt[j]]=1;
                }
            }
            else{
                for (auto x:crt){
                    for (auto y:crt){
                        if (p[x][y]==0) return 0;
                    }
                }

                for (auto x:crt){
                    if (tata[x]!=-1) continue;

                    for (auto y:crt){
                        if (y==x) continue;
                        if (p[x][y]==2) continue;
                        if (tata[y]!=-1) return 0;
                        tata[y]=x;
                    }
                }
                vector <int> v;
                for (auto x:crt){
                    if (tata[x]==-1) v.push_back (x);
                    else{
                        rez[x][tata[x]]=1;
                        rez[tata[x]][x]=1;
                    }
                }
                for (int i=0;i<v.size ();++i){
                    int ni=(i+1)%v.size ();
                    rez[v[i]][v[ni]]=1;
                    rez[v[ni]][v[i]]=1;
                }
            }
        }
    }
    build (rez);
    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...