제출 #508090

#제출 시각아이디문제언어결과실행 시간메모리
508090jamezzz슈퍼트리 잇기 (IOI20_supertrees)C++17
100 / 100
261 ms24180 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(x==y)return; 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]){//single cycle if(u.fp(j)==j)c3[i].push_back(j); } } for(int i=0;i<n;++i){ for(int a:c1[i]){ for(int b:c1[i]){ if(u.fp(a)!=u.fp(b)&&p[a][b]!=2){ return 0; } if(u.fp(a)==u.fp(b)&&p[a][b]!=1){ return 0; } } } } 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)return 0; if(c3[i].size()>=3){ 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...