#include "dreaming.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<vector<pair<ll, ll>>> adj;
vector<bool> vis, dvis;
vector<ll> diapath, diaedges;
void getpath(ll a, ll b, ll N, vector<ll> path = {}, vector<ll> edges = {}){
path.push_back(a);
dvis[a] = true;
if(a == b){
diapath = path;
diaedges = edges;
return;
}
edges.push_back(0);
for(pair<ll, ll> i : adj[a]){
if(!dvis[i.first]){
edges[edges.size()-1] = i.second;
getpath(i.first, b, N, path, edges);
}
}
}
void diameter(ll node, ll N){
diapath.clear(), diaedges.clear();
ll a = 0, b = 0, dist = 0;
dvis = vis;
queue<pair<ll, ll>> q;
queue<tuple<ll, ll, ll>> qd;
vector<ll> dia(N, -1), edges(N), parent(N);
q.push({node, 0});
while(!q.empty()){
pair<ll, ll> val = q.front();
q.pop();
if(dvis[val.first]) continue;
for(pair<ll, ll> 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;
}
qd.push({a, 0, 0});
dvis = vis, dist = 0;
dia[0] = a;
while(!qd.empty()){
tuple<ll, ll, ll> val = qd.front();
qd.pop();
if(dvis[get<0>(val)]) continue;
for(pair<ll, ll> i : adj[get<0>(val)]){
if(!dvis[i.first]){
qd.push({i.first, get<1>(val) + 1, i.second + get<2>(val)});
if(i.second + get<2>(val) > dist){
dist = i.second + get<2>(val);
b = i.first;
}
}
}
dvis[get<0>(val)] = true;
}
dvis = vis;
getpath(a, b, N);
vis = dvis;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
adj.resize(N);
ll ret = 0, 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);
for(ll i = 0; i < N; i++){
if(!vis[i]){
diameter(i, N);
vis[i] = true;
ll c = i, w = 0, dialength = 0;
for(ll j : diaedges) dialength += j;
if(dialength > 0){
for(ll j = 1; w <= dialength / 2; j++){
c = diapath[j];
w += 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);
diameter(0, N);
for(ll i : diaedges) ret += i;
return ret;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |