Submission #413156

#TimeUsernameProblemLanguageResultExecution timeMemory
413156losmi247Connecting Supertrees (IOI20_supertrees)C++14
100 / 100
930 ms26076 KiB
#include <bits/stdc++.h> #include "supertrees.h" using namespace std; typedef long long ll; const int N = 1005; int n; int p[N][N]; int linija(){ vector <vector<int>> ans; for(int i = 1; i <= n; i++){ vector <int> fg; for(int j = 1; j <= n; j++){ if(j == i+1 || j == i-1) fg.push_back(1); else fg.push_back(0); } ans.push_back(fg); } build(ans); return 1; } bool visited[N]; int komp[N]; int cnt = 1; vector <int> sad; void dfs(int x){ visited[x] = 1; komp[x] = cnt; sad.push_back(x); for(int j = 1; j <= n; j++){ if(p[x][j] && !visited[j]) dfs(j); } } int drvo(){ vector <vector<int>> ans; for(int i = 0; i < n; i++){ vector <int> sta(n,0); ans.push_back(sta); } for(int i = 1; i <= n; i++){ if(visited[i]) continue; sad.clear(); dfs(i); for(int j = 0; j < sad.size()-1; j++){ ans[sad[j]-1][sad[j+1]-1] = ans[sad[j+1]-1][sad[j]-1] = 1; } cnt++; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(komp[i] == komp[j] && !p[i][j]) return 0; } } build(ans); return 1; } int krugovi(){ vector <vector<int>> ans; for(int i = 0; i < n; i++){ vector <int> sta(n,0); ans.push_back(sta); } for(int i = 1; i <= n; i++){ if(visited[i]) continue; sad.clear(); dfs(i); if(sad.size() == 2) return 0; for(int j = 0; j < sad.size()-1; j++){ ans[sad[j]-1][sad[j+1]-1] = ans[sad[j+1]-1][sad[j]-1] = 1; } if(sad.size() > 1) ans[sad.back()-1][sad[0]-1] = ans[sad[0]-1][sad.back()-1] = 1; cnt++; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(komp[i] == komp[j] && !p[i][j]) return 0; } } build(ans); return 1; } int pre[N],bio[N],biopre[N],komstb[N],rut[N]; int brs = 1; bool nevalja = 0; vector <int> stablo; void dfs1(int x){ bio[x] = 1; komstb[x] = brs; stablo.push_back(x); for(int h = 1; h <= n; h++){ if(p[x][h] == 1){ if(pre[x] || biopre[x]){ nevalja = 1; return; } if(!bio[h]) dfs1(h); } } } vector <vector<int>> stb[N]; int dodva(){ vector <vector<int>> ans; for(int i = 0; i < n; i++){ vector <int> sta(n,0); ans.push_back(sta); } for(int k = 1; k <= n; k++){ for(int i = 1; i <= n; i++){ if(p[i][k] == 1) continue; for(int j = 1; j <= n; j++){ if(p[i][j] == 1 && p[j][k] == 1/* && p[i][k] != 1*/) return 0; } } } for(int i = 1; i <= n; i++){ if(visited[i]) continue; sad.clear(); for(int j = 1; j <= n; j++) pre[j] = visited[j]; dfs(i); /// resi komponentu stb[cnt].push_back({0}); for(auto f : sad) bio[f] = komstb[f] = 0; brs = 1; for(auto u : sad){ if(bio[u]){ continue; } stablo.clear(); nevalja = 0; dfs1(u); if(nevalja) return 0; for(auto h : stablo) biopre[h] = 1; stb[cnt].push_back(stablo); rut[brs] = u; brs++; } for(auto u : sad){ for(auto v : sad){ if(komstb[u] != komstb[v] && p[u][v] != 2) return 0; } } for(int j = 1; j < brs; j++){ for(int h = 0; h < stb[cnt][j].size()-1; h++){ ans[stb[cnt][j][h]-1][stb[cnt][j][h+1]-1] = ans[stb[cnt][j][h+1]-1][stb[cnt][j][h]-1] = 1; } if(j < brs-1) ans[rut[j]-1][rut[j+1]-1] = ans[rut[j+1]-1][rut[j]-1] = 1; } if(brs-1 == 2){ return 0; } if(brs-1 >= 2) ans[rut[brs-1]-1][rut[1]-1] = ans[rut[1]-1][rut[brs-1]-1] = 1; cnt++; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(komp[i] != komp[j] && p[i][j] != 0) return 0; } } for(int i = 1; i < cnt; i++){ for(int j = 1; j < stb[cnt].size(); j++){ for(auto u : stb[cnt][j]){ for(auto v : stb[cnt][j]){ if(p[u][v] != 1) return 0; } } } } build(ans); return 1; } int construct(vector <vector<int>> nz){ n = nz.size(); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ p[i][j] = nz[i-1][j-1]; } } bool prvi = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) prvi |= (p[i][j] != 1); if(!prvi){ return linija(); } bool drugi = 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(p[i][j] >= 2) drugi = 0; if(drugi){ return drvo(); } bool treci = 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i != j && p[i][j] != 0 && p[i][j] != 2) treci = 0; if(treci){ return krugovi(); } return dodva(); }

Compilation message (stderr)

supertrees.cpp: In function 'int drvo()':
supertrees.cpp:50:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |         for(int j = 0; j < sad.size()-1; j++){
      |                        ~~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int krugovi()':
supertrees.cpp:78:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |         for(int j = 0; j < sad.size()-1; j++){
      |                        ~~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int dodva()':
supertrees.cpp:165:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |             for(int h = 0; h < stb[cnt][j].size()-1; h++){
      |                            ~~^~~~~~~~~~~~~~~~~~~~~~
supertrees.cpp:185:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  185 |         for(int j = 1; j < stb[cnt].size(); j++){
      |                        ~~^~~~~~~~~~~~~~~~~
#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...