#include<bits/stdc++.h>
#include "dreaming.h"
#define pb push_back
using namespace std;
const int MAXN = 1e5 + 5;
vector<pair<int, int> > adj[MAXN];
vector<int> dis(MAXN), vis(MAXN), p(MAXN);
int mx = -1, mxi = -1;
void dfs(int node, int par, int len){
p[node] = par;
dis[node] = len;
vis[node] = 1;
if(dis[node] > mx){
mx = dis[node];
mxi = node;
}
for(auto itr: adj[node]){
if(itr.first != par){
dfs(itr.first, node, len + itr.second);
}
}
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
multiset<int> mset;
for(int i = 0; i < M; i++){
adj[A[i]].pb({B[i], T[i]});
adj[B[i]].pb({A[i], T[i]});
}
for(int i = 0; i < N; i++){
if(vis[i]) continue;
mx = mxi = -1;
dfs(i, i, 0);
int a = mxi;
mx = mxi = -1;
dfs(a, a, 0);
int b = mxi;
// b -> a
int best = mx, node = b;
while(node != p[node]){
best = min(best, max(dis[node], mx - dis[node]));
node = p[node];
}
mset.insert(best);
}
if(mset.size() == 1){
return (*mset.begin());
}
else if(mset.size() == 2){
int sum = 0;
for(auto itr: mset) sum += itr;
sum += L;
return sum;
}
else{
auto lst = mset.end();
lst--;
int mx1 = *lst;
lst--;
int mx2 = *lst;
lst--;
int mx3 = *lst;
int ans = max(mx1 + mx2 + L, mx2 + mx3 + 2 * L);
return ans;
}
}
# | 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... |