Submission #385706

#TimeUsernameProblemLanguageResultExecution timeMemory
385706DavidDamianConnecting Supertrees (IOI20_supertrees)C++17
21 / 100
268 ms22380 KiB
#include "supertrees.h"
#include <vector>
using namespace std;
int link[1005];
int setSize[1005];
void init(int n)
{
    for(int i=1;i<=n;i++){
        link[i]=i;
        setSize[i]=1;
    }
}
int root(int u)
{
    if(link[u]==u) return u;
    else return link[u]=root(link[u]);
}
bool same(int a,int b)
{
    return root(a)==root(b);
}
void unite(int a,int b)
{
    a=root(a);
    b=root(b);
    if(setSize[b]>setSize[a])
        swap(a,b);
    setSize[a]+=setSize[b];
    link[b]=a;
}
int construct(vector< vector<int> > p) {
	int n = p.size();
	init(n+3);
	vector< vector<int> > answer;
	for (int i = 0; i < n; i++) {
		vector<int> row;
		row.resize(n);
		answer.push_back(row);
	}
	for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(p[i][j]==1 && !same(i+1,j+1)){
                int a=root(i+1);
                int b=root(j+1);
                answer[a-1][b-1]=1;
                answer[b-1][a-1]=1;
                unite(a,b);
            }
        }
	}
	bool possible=true;
	for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(p[i][j]!=same(i+1,j+1))
                possible=false;
        }
	}
	if(!possible)
        return 0;
	build(answer);
	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...