Submission #1367698

#TimeUsernameProblemLanguageResultExecution timeMemory
1367698DangerNoodle7591Connecting Supertrees (IOI20_supertrees)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005



vector<int> grub[N];
int cev[N][N];



int father[N],sze[N];
int dsu(int x){
	if(father[x]==x)return x;
	return father[x]=dsu(father[x]);
}
void kardes(int x,int y){
	x=dsu(x);y=dsu(y);
	if(x==y)return;
	if(sze[x]<sze[y])swap(x,y);
	sze[x]+=sze[y];
	father[y]=x;
}



void build(vector<vector<int>> _b);
int construct(vector<vector<int>> p) {
	int n = p.size();
	for(int i=0;i<=n;i++){
		father[i]=i;
		sze[i]=1;
		grub[i].clear();
	}

	for (int i = 0; i < n; i++) {
		int iki=0,bir=0;
		for(int j=0;j<n;j++){
			cev[i][j]=0;
			if(p[i][j])kardes(i,j);
		}
	}

	for (int i = 0; i < n; i++) {
		for(int j=0;j<n;j++){
			if(p[i][j]==0&&dsu(i)==dsu(j))return 0;
			if(p[i][j]&&dsu(i)!=dsu(j))return 0;
		}
		grub[dsu(i)].pb(i);
	}


	for(int k=0;k<n;k++){
		if(dsu(k)!=k)continue;
		int once=-1;
		for(auto u:grub[k]){
			for(auto uu:grub[k]){
				if(uu==u)continue;
				if(p[u][uu]!=2)return 0;
			}
			if(once!=-1){
				cev[once][u]=1;
				cev[u][once]=1;
			}
			once=u;
		}
		
		cev[once][grub[k][0]]=1;
		cev[grub[k][0]][once]=1;
	}



	vector<vector<int>> answer;
	for(int i=0;i<n;i++){
		vector<int> row;
		for(int j=0;j<n;j++){
			row.pb(cev[i][j]);
		}
		answer.pb(row);
	}

	build(answer);
	return 1;
}



/*int n;
vector<vector<int>> p;
vector<vector<int>> b;
bool called = false;

static void check(bool cond, string message) {
    if (!cond) {
        printf("%s\n", message.c_str());
        fclose(stdout);
        exit(0);
    }
}

void build(vector<vector<int>> _b) {
    check(!called, "build is called more than once");
    called = true;
    check((int)_b.size() == n, "Invalid number of rows in b");
    for (int i = 0; i < n; i++) {
        check((int)_b[i].size() == n, "Invalid number of columns in b");
    }
    b = _b;
}

int main() {
    assert(scanf("%d", &n) == 1);
    
    p.resize(n);
    for (int i = 0; i < n; i++) {
        p[i].resize(n);
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            assert(scanf("%d", &p[i][j]) == 1);
        }
    }
    fclose(stdin);

    int possible = construct(p);

    check(possible == 0 || possible == 1, "Invalid return value of construct");
    if (possible == 1) {
        check(called, "construct returned 1 without calling build");
    } else {
        check(!called, "construct called build but returned 0");
    }

    printf("%d\n", possible);
    if (possible == 1) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (j) {
                    printf(" ");
                }
                printf("%d", b[i][j]);
            }
            printf("\n");
        }
    }
    fclose(stdout);
}*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...