# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1269015 | coderg | Dreaming (IOI13_dreaming) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
typedef long long ll;
#define F first
#define S second
vector<vector<pair<int,ll>>> adj;
vector<pair<ll,ll>> dp1,dp2,path;
vector<int> pt,used;
void dfs1(int v,int e){
used[v]=1;
pt.push_back(v);
for(auto &u:adj[v]){
if(u.F==e)continue;
dfs1(u.F,v);
ll val=dp1[u.F].F+u.S;
if(val>=dp1[v].F){
dp2[v]=dp1[v];
dp1[v]={val,u.F};
}else if(val>=dp2[v].F){
dp2[v]={val,u.F};
}
}
}
void dfs2(int v,int e){
for(auto &u:adj[v]){
if(u.F==e)continue;
ll val;
if(u.F==dp1[v].S)val=dp2[v].F+u.S;
else val=dp1[v].F+u.S;
if(val>=dp1[u.F].F){
dp2[u.F]=dp1[u.F];
dp1[u.F]={val,v};
}else if(val>=dp2[u.F].F){
dp2[u.F]={val,v};
}
dfs2(u.F,v);
}
}
void init(ll pos){
pt.clear();
dfs1(pos,-1);
dfs2(pos,-1);
ll mx=0;
for(auto v:pt){
mx=max(mx,dp1[v].F+dp2[v].F);
}
int idx=-1;
ll mn=LLONG_MAX;
for(auto v:pt){
ll val=dp1[v].F+dp2[v].F;
if(val==mx){
ll x=max(dp1[v].F,dp2[v].F);
if(x<mn){
mn=x;
idx=v;
}
}
}
path.push_back({mn,idx});
}
ll travelTime(int N,int M,int L,int a[],int b[],int t[]){
adj.assign(N,vector<pair<int,ll>>());
dp1.assign(N,{0,-1});
dp2.assign(N,{0,-1});
used.assign(N,0);
path.clear();
for(int i=0;i<M;i++){
int x=a[i],y=b[i];
ll z=t[i];
adj[x].push_back({y,z});
adj[y].push_back({x,z});
}
for(int i=0;i<N;i++){
if(!used[i])init(i);
}
sort(path.begin(),path.end(),greater<pair<ll,int>>());
for(int i=1;i<path.size();i++){
int x=path[i].S,y=path[0].S;
adj[x].push_back({y,(ll)L});
adj[y].push_back({x,(ll)L});
}
for(int i=0;i<N;i++){
dp1[i]=dp2[i]={0,-1};
}
pt.clear();
dfs1(0,-1);
dfs2(0,-1);
ll mx=0;
for(int i=0;i<N;i++) mx=max(mx,dp1[i].F);
return mx;
}