제출 #507449

#제출 시각아이디문제언어결과실행 시간메모리
507449jamezzz슈퍼트리 잇기 (IOI20_supertrees)C++17
56 / 100
226 ms24132 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; struct ufds{ int par[1005],rnk[1005]; void init(int n){ for(int i=0;i<n;++i)par[i]=i,rnk[i]=0; } int fp(int i){return (par[i]==i)?i:par[i]=fp(par[i]);} void join(int x,int y){ x=fp(x),y=fp(y); if(rnk[x]==rnk[y])par[x]=y; else par[y]=x; if(rnk[x]==rnk[y])++rnk[x]; } }u; int construct(vector<vector<int>> p){ int n=p.size(); u.init(n); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(p[i][j]==3)return 0; if(p[i][j]!=0)u.join(i,j); } } vector<vector<int>> c1; c1.resize(n); for(int i=0;i<n;++i){ c1[u.fp(i)].push_back(i); for(int j=0;j<n;++j){ if(u.fp(i)==u.fp(j)&&p[i][j]==0){ return 0; } } } u.init(n); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(p[i][j]==1)u.join(i,j); } } vector<vector<int>> c2,c3; c2.resize(n); c3.resize(n); for(int i=0;i<n;++i){ c2[u.fp(i)].push_back(i); for(int j:c1[i]){ if(u.fp(j)==j)c3[i].push_back(j); } } vector<vector<int>> answer; answer.resize(n); for(int i=0;i<n;i++)answer[i].resize(n); for(int i=0;i<n;++i){ for(int j:c2[i]){ if(i!=j)answer[i][j]=answer[j][i]=1; } } for(int i=0;i<n;++i){ if(c3[i].size()>=2){ int m=c3[i].size(); for(int j=0;j<m;++j){ int a=c3[i][j],b=c3[i][(j+1)%m]; if(a!=b)answer[a][b]=answer[b][a]=1; } } } 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...