#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, mxi;
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[]) {
priority_queue<int> pq;
for(int i = 0; i < M; i++){
adj[A[i]].pb({B[i], T[i]});
adj[B[i]].pb({A[i], T[i]});
}
int ans = 0;
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;
// a -> b
int best = dis[b], node = b;
while(true){
best = min(best, max(dis[node], dis[b] - dis[node]));
if(node == p[node]) break;
node = p[node];
}
ans = max(ans, dis[b]);
pq.push(best);
}
if(pq.size() == 1){
ans = max(ans, pq.top());
}
else if(pq.size() == 2){
int sum = 0;
while(pq.size()){
sum += pq.top();
pq.pop();
}
sum += L;
ans = max(ans, sum);
}
else{
int mx1 = pq.top();
pq.pop();
int mx2 = pq.top();
pq.pop();
int mx3 = pq.top();
pq.pop();
ans = max({ans, 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... |