Submission #306301

#TimeUsernameProblemLanguageResultExecution timeMemory
306301andreiomdConnecting Supertrees (IOI20_supertrees)C++14
11 / 100
271 ms31112 KiB
#include "supertrees.h" #include <vector> using namespace std; const int NMAX = 1e3 + 1; int N; int roads[NMAX][NMAX]; vector < int > tree[NMAX], cycle[NMAX]; bool Edge[NMAX][NMAX]; vector < int > line; vector < vector < int > > ans; bool Sel_tree[NMAX]; int Id_tree[NMAX]; static inline void Add_Edge (int X, int Y) { Edge[X][Y] = Edge[Y][X] = 1; return; } static inline void DFS (int Node, int Id) { Sel_tree[Node] = 1, Id_tree[Node] = Id; for(auto it : tree[Node]) if(!Sel_tree[it]) Add_Edge(Node, it), DFS(it, Id); return; } static inline void Build_trees () { for(int i = 1; i <= N; ++i) if(!tree[i].empty() && !Sel_tree[i]) DFS(i, i); return; } static inline void Solve () { Build_trees(); return; } static inline void Reconstruct () { for(int i = 1; i <= N; ++i) { line.clear(); for(int j = 1; j <= N; ++j) line.push_back(Edge[i][j]); ans.push_back(line); } return; } static inline bool Check () { for(int i = 1; i < N; ++i) for(int j = i + 1; j <= N; ++j) if(Id_tree[i] == Id_tree[j] && roads[i][j] == 0) return 0; return 1; } int construct (vector < vector < int > > p) { N = (int)p.size(); for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) { roads[i + 1][j + 1] = p[i][j]; if(i == j) continue; if(p[i][j] == 1) tree[i + 1].push_back(j + 1); else if(p[i][j] == 2) cycle[i + 1].push_back(j + 1); else if(p[i][j] == 3) return 0; } Solve(); if(!Check()) return 0; Reconstruct(); build(ans); 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...