제출 #984305

#제출 시각아이디문제언어결과실행 시간메모리
984305CSQ31Connecting Supertrees (IOI20_supertrees)C++17
46 / 100
177 ms32016 KiB
#include "supertrees.h" #include<bits/stdc++.h> using namespace std; #define sz(a) (int)(a.size()) int p[1000][1000],ans[1000][1000]; void add(int v,int u){ ans[v][u] = ans[u][v] = 1; } int construct(vector<vector<int>> P) { int n = sz(P); for (int i=0;i<n;i++){ for(int j=0;j<n;j++){ p[i][j] = P[i][j]; if(p[i][j] == 3)return 0; } } //find all nodes connected to 1 //then nodes with p(1,v) = 1 //this has to form a tree //repeat forming many trees then link the trees in a cycle vector<int>ded(n,0); for(int i=0;i<n;i++){ if(ded[i])continue; vector<int>comp; vector<bool>incomp(n,0); for(int j=0;j<n;j++){ if(ded[j])continue; if(p[i][j]){ incomp[j] = 1; comp.push_back(j); ded[j] = 1; } } //for(int x:comp)cout<<x<<" "; //cout<<'\n'; vector<vector<int>>trees; while(!comp.empty()){ int v = comp[0]; vector<int>tree,tmp; for(int u:comp){ if(p[u][v] == 1)tree.push_back(u); else tmp.push_back(u); } trees.push_back(tree); comp = tmp; } int ss = sz(trees); if(ss > 1)add(trees[0][0],trees[ss-1][0]); for(int i=0;i<ss;i++){ if(i+1<sz(trees)){ add(trees[i][0],trees[i+1][0]); } for(int j=0;j+1<sz(trees[i]);j++){ add(trees[i][j],trees[i][j+1]); } } } vector<vector<int>>fin(n); for(int i=0;i<n;i++){ fin[i].assign(n,0); for(int j=0;j<n;j++)fin[i][j] = ans[i][j]; } build(fin); 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...