# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
300135 | Hehehe | 꿈 (IOI13_dreaming) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#define DIM 100010
#define INF 2000000000
#include "dreaming.h"
using namespace std;
ifstream fin ("dreaming.in");
ofstream fout ("dreaming.out");
int nr,n,m,l,i;
int dp_down[DIM]; /// cel mai lung drum in subarborele lui i
int dp_up[DIM]; /// cel mai lung drum din i in afara subarborelui lui i
int s[DIM],viz[DIM],v[DIM],a[DIM],b[DIM],cost[DIM];
vector <pair<int,int> > L[DIM];
vector <int> comp[DIM];
void dfs (int nod, int tata){
viz[nod] = 1;
comp[nr].push_back(nod);
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i].first;
if (vecin != tata){
dfs (vecin,nod);
s[nod] = max (s[nod],s[vecin]+L[nod][i].second);
}}
int maxim = 0, maxim2 = 0;
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i].first, cost = L[nod][i].second;
if (vecin == tata)
continue;
if (s[vecin]+cost > maxim){
maxim2 = maxim;
maxim = s[vecin]+cost;
} else {
if (s[vecin]+cost > maxim2)
maxim2 = s[vecin]+cost;
}}
dp_down[nod] = maxim+maxim2;
}
void dfs2 (int nod, int tata, int cost){
dp_up[nod] = max (dp_up[nod],dp_up[tata]+cost);
int maxim = 0, maxim2 = 0, p = 0;
for (int i=0;i<L[nod].size();i++){
int fiu = L[nod][i].first, cst = L[nod][i].second;
if (fiu == tata)
continue;
if (s[fiu]+cst > maxim){
maxim2 = maxim;
maxim = s[fiu]+cst, p = fiu;
} else
if (s[fiu]+cst > maxim2)
maxim2 = s[fiu]+cst;
}
for (int i=0;i<L[nod].size();i++){
int fiu = L[nod][i].first;
if (fiu == tata)
continue;
if (fiu == p)
dp_up[fiu] = max (dp_up[fiu],maxim2+L[nod][i].second);
else dp_up[fiu] = max (dp_up[fiu],maxim+L[nod][i].second);
}
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i].first;
if (vecin != tata)
dfs2 (vecin,nod,L[nod][i].second);
}}
int travelTime (int n, int m, int l, int a[], int b[], int cost[]){
for(int i = 0; i <= n; i++){
v[i].clear();
}
for(int i = 0; i < m; i++){
int x = a[i], y = b[i], z = cost[i];
x++, y++;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
memset(viz,0,sizeof(viz));
memset(dp_up,0,sizeof(dp_up));
memset(dp_down,0,sizeof(dp_down));
memset(s,0,sizeof(s));
for(int i = 1; i <= n; i++){
if(viz[i])continue;
nr++;
dfs(i, 0);
dfs2(i, 0, 0);
}
int ans = 0;
for(int i = 1;i <= nr; i++){
int mn = inf;
for(auto nod : c[i]){
int dist_max = max(dp_up[nod] + s[nod], dp_down[nod]);
ans = max(ans, dist_max);
int dist = max(s[nod], dp_up[nod]);
mn = min(mn,dist);
}
path[i] = mn;
}
sort(path + 1, path + nr + 1);
if(nr >= 2)ans = max(ans, path[nr] + path[nr - 1] + l);
if(nr >= 3)ans = max(ans, path[nr - 1] + path[nr - 2] + 2*l);
return ans;
}