제출 #347135

#제출 시각아이디문제언어결과실행 시간메모리
347135Dilshod_Imomov슈퍼트리 잇기 (IOI20_supertrees)C++17
11 / 100
281 ms28140 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; const int N = 1e3 + 7; vector < int > adj[N], visited(N); bool first[N]; void dfs( int v ) { visited[v] = 1; for ( auto u: adj[v] ) { if ( !visited[u] ) { dfs(u); } } } int construct(std::vector<std::vector<int>> p) { int n = p.size(); std::vector<std::vector<int>> answer; for (int i = 0; i < n; i++) { std::vector<int> row; row.resize(n); answer.push_back(row); } for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < n; j++ ) { if ( i == j ) { continue; } if ( p[i][j] == 1 ) { adj[i].push_back(j); } } } vector < int > comp, used(n + 7); for ( int i = 0; i < n; i++ ) { if ( visited[i] ) { continue; } first[i] = i + 1; for ( auto j: adj[i] ) { if ( first[j] ) { return 0; } first[j] = i + 1; visited[j] = 1; } comp.push_back(i); } for ( int i = 0; i < n; i++ ) { if ( used[i] ) { continue; } used[i] = i + 1; for ( auto j: adj[i] ) { answer[i][j] = 1; used[j] = i + 1; answer[j][i] = 1; for ( auto k: adj[i] ) { if ( j != k && p[j][k] != 1 ) { return 0; } } } } for ( int j = 0; j < n; j++ ) { for ( int i = 0; i < n; i++ ) { if ( p[i][j] == 1 && first[i] != first[j] ) { return 0; } } } int sz = comp.size(); used = vector < int > (n + 7); for ( int i = 0; i < sz; i++ ) { vector < int > vc = { comp[i] }; if ( used[ comp[i] ] ) { continue; } used[ comp[i] ] = i + 1; int v = comp[i]; for ( int j = 0; j < sz; j++ ) { if ( i != j && p[ comp[i] ][ comp[j] ] == 2 ) { vc.push_back(comp[j]); used[ comp[j] ] = i + 1; int u = comp[j]; for ( auto x: adj[v] ) { for ( auto y: adj[u] ) { if ( p[x][y] != 2 ) { return 0; } } } } } for ( int j = 0; j < sz; j++ ) { int u = comp[j]; if ( i != j && p[ v ][u] == 0 ) { for ( auto x: adj[v] ) { for ( auto y: adj[u] ) { if ( p[x][y] ) { return 0; } } } } } int szz = vc.size(); for ( int i = 0; i < szz - 1; i++ ) { answer[vc[i]][vc[i + 1]] = 1; answer[ vc[i + 1] ][ vc[i] ] = 1; } if ( szz > 1 ) { answer[ vc[szz - 1] ][ vc[0] ] = 1; answer[ vc[ 0 ] ][ vc[szz - 1] ] = 1; } } for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < n; j++ ) { if ( p[i][j] && first[i] != first[j] ) { return 0; } if ( first[i] == first[j] && !p[i][j] ) { return 0; } } } 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...