Submission #367145

#TimeUsernameProblemLanguageResultExecution timeMemory
367145MilosMilutinovicConnecting Supertrees (IOI20_supertrees)C++14
21 / 100
290 ms30444 KiB
#include <bits/stdc++.h> #include "supertrees.h" using namespace std; #define pb push_back const int N=1050; vector<int> E[N]; vector<vector<int>> p; vector<vector<int>> ans(N,vector<int>(N,0)); void AddEdge(int u,int v){E[u].pb(v);E[v].pb(u);} vector<int> Euler; bool was[N]; void DFS1(int u){ was[u]=true,Euler.pb(u); for(int v:E[u])if(!was[v]&&p[u][v]==1)DFS1(v); } void DFS2(int u){ was[u]=true,Euler.pb(u); for(int v:E[u])if(!was[v]&&p[u][v]==2)DFS2(v); } int construct(vector<vector<int>> P){ p=P;int n=(int)P.size(); for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(p[i][j]==3)return 0; ans.resize(n); for(int i=0;i<n;i++)ans[i].resize(n); for(int i=0;i<n;i++)for(int j=0;j<n;j++)ans[i][j]=0; for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(p[i][j]>0)AddEdge(i,j); bool one=false,two=false; for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(p[i][j]==1)one=true; for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(p[i][j]==2)two=true; if(!one&&!two){build(ans);return 1;} if(one&&!two){ for(int i=0;i<n;i++){ if(!was[i]){ DFS1(i); if((int)Euler.size()==1){Euler.clear();continue;} for(int x:Euler)for(int y:Euler)if(x!=y&&p[x][y]==0)return 0; for(int i=1;i<(int)Euler.size();i++){ int x=Euler[i],y=Euler[i-1]; ans[x][y]=ans[y][x]=1; } Euler.clear(); } } build(ans); return 1; } if(!one&&two){ for(int i=0;i<n;i++){ if(!was[i]){ DFS2(i); if((int)Euler.size()==1){Euler.clear();continue;} if((int)Euler.size()==2)return 0; for(int x:Euler)for(int y:Euler)if(x!=y&&p[x][y]==0)return 0; for(int i=1;i<(int)Euler.size();i++){ int x=Euler[i],y=Euler[i-1]; ans[x][y]=ans[y][x]=1; } if(Euler.size()>2){ int x=Euler[0],y=Euler.back(); ans[x][y]=ans[y][x]=1; } Euler.clear(); } } build(ans); return 1; } if(one&&two){ vector<int> root; for(int i=0;i<n;i++){ if(!was[i]){ DFS1(i); root.pb(i); if(Euler.size()==1){Euler.clear();continue;} for(int x:Euler)for(int y:Euler)if(x!=y&&p[x][y]!=1)return 0; for(int i=0;i<(int)Euler.size();i++){ int x=Euler[i]; if(x!=i)ans[i][x]=ans[x][i]=1; } Euler.clear(); } } if((int)root.size()==2)return 0; for(int i=1;i<(int)root.size();i++){ int x=root[i],y=root[i-1]; ans[x][y]=ans[y][x]=1; } if((int)root.size()>2){ int x=root[0],y=root.back(); ans[x][y]=ans[y][x]=1; } build(ans); return 1; } }

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:95:1: warning: control reaches end of non-void function [-Wreturn-type]
   95 | }
      | ^
#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...