Submission #1223150

#TimeUsernameProblemLanguageResultExecution timeMemory
1223150nikdLongest Trip (IOI23_longesttrip)C++20
5 / 100
337 ms740 KiB
#include "longesttrip.h" #include <bits/stdc++.h> #include <iterator> using namespace std; std::vector<int> longest_trip(int n, int D) { vector<vector<bool>> mt(n, vector<bool>(n)); vector<vector<int>> adj(n); for(int i = 0; i<n; i++){ for(int j = i+1; j<n; j++){ if(are_connected({i}, {j})){ mt[i][j] = 1; mt[j][i] = 1; adj[i].push_back(j); adj[j].push_back(i); } } } // D = 1 :D //vedo se ci sono due cc (ez dfs) // poi devo togliere questo pezzo vector<bool> vis(n, 0); function<void(int)> dfs = [&](int v){ vis[v] = 1; for(int u: adj[v]){ if(vis[u]) continue; dfs(u); } }; dfs(0); int cnt = 0; for(int i = 0; i<n; i++) cnt += vis[i]; if(cnt != n){ vector<int> sol; if(cnt >= (n+1)/2){ for(int i= 0; i<n; i++) if(vis[i]) sol.push_back(i); } else{ for(int i= 0; i<n; i++) if(!vis[i]) sol.push_back(i); } return sol; } //trovo due non collegati vector<int> first; vector<int> second; for(int i = 0; i<n; i++){ for(int j = i+1; j<n; j++){ if(!mt[i][j]){ first.push_back(i); second.push_back(j); i = n; break; } } } if(first.empty()){ vector<int> sol(n); iota(sol.begin(), sol.end(), 0); return sol; } //ciclo sugli altri e dvido in tre array vector<int> md; for(int i = 0; i<n; i++){ if(i == first[0] || i == second[0]) continue; bool b1 = mt[i][first[0]]; bool b2 = mt[i][second[0]]; if(b1 && b2) md.push_back(i); else if(b1) first.push_back(i); else if(b2) second.push_back(i); else assert(0); } //separo a metà quelli in mezzzo if(md.size()){ vector<int> md1 = {md[0]}; vector<int> md2; for(int i = 1; i<md.size(); i++){ if(mt[md[0]][i]) md1.push_back(i); else md2.push_back(i); } //assegno le due metà for(int i: first){ if(!mt[i][md1[0]]){ swap(md1, md2); break; } } for(int i: md1) first.push_back(i); for(int i: md2) second.push_back(i); } //visito cricca sx a partire da uno in mezzo e visito cricca dx allo stesso modo for(int i: first){ for(int j: second){ if(mt[i][j]){ vector<int> sol; for(int i_:first){ if(i_ == i) continue; sol.push_back(i_); } sol.push_back(i); sol.push_back(j); for(int i_:second){ if(i_==j) continue; sol.push_back(i_); } return sol; } } } assert(0); }
#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...