제출 #1183914

#제출 시각아이디문제언어결과실행 시간메모리
1183914kiwimsyDreaming (IOI13_dreaming)C++20
18 / 100
688 ms8332 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; vector<vector<pair<int, int>>> adj; vector<bool> vis, dvis; vector<int> diapath, diaedges; int diameter(int node, int N){ diapath.clear(), diaedges.clear(); int a = 0, b = 0, dist = 0, p; dvis = vis; queue<pair<int, int>> q; vector<int> parent(N); q.push({node, 0}); while(!q.empty()){ pair<int, int> val = q.front(); q.pop(); if(dvis[val.first]) continue; for(pair<int, int> i : adj[val.first]){ if(!dvis[i.first]){ q.push({i.first, i.second + val.second}); if(i.second + val.second > dist){ a = i.first; dist = i.second + val.second; } } } dvis[val.first] = true; } q.push({a, 0}); dvis = vis, dist = 0; while(!q.empty()){ pair<int, int> val = q.front(); q.pop(); if(dvis[val.first]) continue; for(pair<int, int> i : adj[val.first]){ if(!dvis[i.first]){ parent[i.first] = val.first; q.push({i.first, i.second + val.second}); if(i.second + val.second > dist){ b = i.first; dist = i.second + val.second; } } } dvis[val.first] = true; } p = b; while(p != a){ diapath.push_back(p); for(pair<int, int> i : adj[p]) if(i.first == parent[p]) diaedges.push_back(i.second); p = parent[p]; } diapath.push_back(a); vis = dvis; return dist; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { adj.resize(N); int ret = 0, bigcenter = 0, maxdia = 0; vector<int> centers; for(int i = 0; i < M; i++){ adj[A[i]].push_back({B[i], T[i]}); adj[B[i]].push_back({A[i], T[i]}); } vis.assign(N, false); for(int i = 0; i < N; i++){ if(!vis[i]){ int dialength = diameter(i, N); vis[i] = true; int c = i, c1 = i, c2 = i, fw = 0, bw = 0; if(dialength > 0){ vector<int> pref = {0}, suff; int p = 0, s = 0, mindist; for(int i = 0; i < diaedges.size(); i++){ fw += diaedges[i]; bw += diaedges[diaedges.size() - i - 1]; p += fw; s += bw; pref.push_back(p); suff.push_back(s); } suff.push_back(0); mindist = p; for(int i = 1; i < diapath.size(); i++){ if(abs(pref[i] - suff[suff.size() - i - 1]) < mindist){ mindist = abs(pref[i] - suff[suff.size() - i - 1]); c = diapath[i]; } } } if(dialength > maxdia){ bigcenter = c; maxdia = dialength; } centers.push_back(c); } } for(int i : centers){ if(i != bigcenter){ adj[i].push_back({bigcenter, L}); adj[bigcenter].push_back({i, L}); } } vis.assign(N, false); return diameter(0, N); }
#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...