제출 #1184036

#제출 시각아이디문제언어결과실행 시간메모리
1184036kiwimsy꿈 (IOI13_dreaming)C++20
65 / 100
80 ms11904 KiB
#include "dreaming.h" #include <bits/stdc++.h> #define ll long long using namespace std; ll rad; vector<vector<pair<ll, ll>>> adj; vector<bool> vis, dvis; vector<ll> diapath, diaedges; vector<ll> parent; pair<ll, ll> get_furthest(ll node){ dvis = vis; queue<pair<ll, ll>> q; ll dist = 0, ret = 0; q.push({node, 0}); while(!q.empty()){ pair<ll, ll> val = q.front(); q.pop(); for(pair<ll, ll> 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){ ret = i.first; dist = i.second + val.second; } } } dvis[val.first] = true; } return {ret, dist}; } ll diameter(ll node, ll N){ diapath.clear(), diaedges.clear(); ll a = 0, b = 0, dist = 0, p; pair<ll, ll> dia; a = get_furthest(node).first; dia = get_furthest(a); b = dia.first; p = b; while(p != a){ diapath.push_back(p); for(pair<ll, ll> i : adj[p]) if(i.first == parent[p]) diaedges.push_back(i.second); p = parent[p]; } diapath.push_back(a); vis = dvis; return dia.second; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { adj.resize(N), parent.resize(N); ll bigcenter = 0, maxdia = 0; vector<ll> centers; for(ll 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), dvis = vis; for(ll i = 0; i < N; i++){ if(!vis[i]){ ll dialength = diameter(i, N); ll c = i, p = 0, mindist = dialength; if(dialength > 0){ for(ll j = 0; j < diapath.size(); j++){ if(max(p, dialength - p) < mindist){ c = diapath[j]; mindist = max(p, dialength - p); } if(j < diaedges.size()) p += diaedges[j]; } p = 0; for(ll j = diapath.size()-1; j >= 0; j--){ if(max(p, dialength - p) < mindist){ c = diapath[j]; mindist = max(p, dialength - p); } if(j-1 < diaedges.size()) p += diaedges[j-1]; } } if(dialength > maxdia){ bigcenter = c; maxdia = dialength; } centers.push_back(c); } } for(ll 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...