#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
#define ll long long
#define show(n) cout<<n<<'\n'
#define all(v) v.begin(), v.end()
#define pb push_back
#define fi first
#define se second
const int INF = 2e9;
const int mxN = 1e5 + 5000;
vector<pair<int,int>> adj[mxN];
int down_dp[mxN],up_dp[mxN],dp[mxN],vis[mxN],cost1=0,cost2=0,grp=1;
vector<int> group_max(mxN,INF),group_max_node(mxN,0);
void dfs(int u,int par){
vis[u]=grp;
for(auto it:adj[u]){
if(it.fi==par) continue;
dfs(it.fi,u);
down_dp[u]=max(down_dp[u],down_dp[it.fi]+it.se);
}
}
void reroot(int u,int par){
int c[2]; pair<int,int> p;
p.fi=p.se=-1;
c[0]=c[1]=0;
dp[u]=max(dp[u],down_dp[u]);
for(auto it:adj[u]){
if(it.fi!=par){
if(p.fi==-1) p.fi=it.fi,c[0]=it.se;
else if(down_dp[p.fi]+c[0]<down_dp[it.fi]+it.se){
swap(p.fi,p.se);
swap(c[0],c[1]);
c[0]=it.se;
p.fi=it.fi;
}else if(down_dp[p.se]+c[1]<down_dp[it.fi]+it.se){
p.se=it.fi;
c[1]=it.se;
}
}
}
for(auto it:adj[u]){
if(it.fi^par){
up_dp[it.fi]=up_dp[u]+it.se;
if(it.fi==p.fi&&p.fi==-1) up_dp[it.fi]=0;
else if(it.fi==p.fi) up_dp[it.fi]=max(up_dp[it.fi],down_dp[p.se]+c[1]+it.se);
else up_dp[it.fi]=max(up_dp[it.fi],down_dp[p.fi]+c[0]+it.se);
dp[it.fi]=max(up_dp[it.fi],down_dp[it.fi]);
reroot(it.fi,u);
}
}
cost1=max(cost1,dp[u]);
}
pair<int,int> max_dist(int u,int par,int w){
pair<int,int> ans={w,u};
for(auto it:adj[u]){
if(it.fi!=par){
ans=max(ans,max_dist(it.fi,u,w+it.se));
}
}
return ans;
}
int travelTime(int N,int M,int L,int A[],int B[],int T[]){
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]==0){
dfs(i,-1);
reroot(i,-1);
++grp;
}
}
for(int i=0;i<N;++i){
if(group_max[vis[i]]>dp[i]){
group_max[vis[i]]=dp[i];
group_max_node[vis[i]]=i;
}
}
for(int i=2;i<grp;++i){
adj[group_max_node[i-1]].pb({group_max_node[i],L});
adj[group_max_node[i]].pb({group_max_node[i-1],L});
if(group_max_node[i-1]<0||group_max_node[i-1]>=N){
while(1){}
}
if(group_max_node[i]<0||group_max_node[i]>=N){
while(1){}
}
}
/* pair<int,int> p1=max_dist(0,-1,0);
pair<int,int> p2=max_dist(p1.fi,-1,0);
*/
return max(cost1,group_max[1]+group_max[2]+L);
}
# | 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... |