# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
962058 | serkanrashid | Dreaming (IOI13_dreaming) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include"dreaming.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
struct edge
{
int ver,dist;
edge(){};
edge(int vi, int di)
{
ver = vi;
dist = di;
}
};
int n;
vector<edge> g[MAXN];
int sub[MAXN],used[MAXN];
int mind;
vector<int> comp;
void clear_used()
{
for(int i = 0; i < n; i++) used[i] = 0;
}
void dfs_dp(int beg, int gor)
{
used[beg] = 1;
int maxch = max(sub[beg],gor);
mind = min(mind,maxch);
int fir = 0, sec = 0;
for(edge nb : g[beg])
{
if(!used[nb.ver])
{
if(nb.dist+sub[nb.ver] > fir)
{
sec = fir;
fir = nb.dist+sub[nb.ver];
}
else if(nb.dist+sub[nb.ver] > sec)
{
sec = nb.dist+sub[nb.ver];
}
}
}
for(edge nb : g[beg])
{
if(!used[nb.ver])
{
int new_gor = gor;
if(nb.dist+sub[nb] == fir) new_gor = max(new_gor,sec);
else new_gor = max(new_gor,fir);
new_gor += nb.dist;
dfs_dp(nb.ver,new_gor);
}
}
}
void dfs(int beg)
{
used[beg] = 1;
for(edge nb : g[beg])
{
if(!used[nb.ver])
{
dfs(nb.ver);
sub[beg] = max(sub[beg],sub[nb.ver]+nb.dist);
}
}
}
int travelTime(int N,int M,int L,int A[],int B[],int T[])
{
n = N;
for(int i = 0; i < M; i++)
{
g[A[i]].push_back({B[i],T[i]});
g[B[i]].push_back({A[i],T[i]});
}
for(int i = 0; i < N; i++) if(!used[i]) dfs(i);
clear_used();
for(int i = 0; i < N; i++)
{
if(!used[i])
{
mind = 1e9+5;
dfs_dp(i,0);
comp.push_back(mind);
}
}
return comp[0]+comp[1]+l;
}