Submission #383493

#TimeUsernameProblemLanguageResultExecution timeMemory
383493alireza_kavianiDreaming (IOI13_dreaming)C++11
100 / 100
108 ms18048 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;

typedef pair<int, int> pii;

#define X			first
#define Y			second
#define all(x)		(x).begin() , (x).end()
#define SZ(x)		int(x.size())

const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;

int mark[MAXN] , dpDown[MAXN] , dpUp[MAXN];
vector<int> vec;
vector<pii> adj[MAXN];

void DFSDown(int v , int p = -1){
	mark[v] = 1;
	vec.push_back(v);
	for(pii i : adj[v]){
		int u = i.X , w = i.Y;
		if(u == p)	continue;
		DFSDown(u , v);
		dpDown[v] = max(dpDown[v] , dpDown[u] + w);
	}
}

void DFSUp(int v , int p = -1){
	int mx = 0;
	for(pii i : adj[v]){
		int u = i.X , w = i.Y;
		if(u == p)	continue;
		dpUp[u] = max(dpUp[v] , mx) + w;
		mx = max(mx , dpDown[u] + w);
	}
	reverse(all(adj[v])); mx = 0;
	for(pii i : adj[v]){
		int u = i.X , w = i.Y;
		if(u == p)	continue;
		dpUp[u] = max(dpUp[u] , max(dpUp[v] , mx) + w);
		mx = max(mx , dpDown[u] + w);
//		cout << v << ' ' << u << ' ' << mx << endl;
		DFSUp(u , v);
	}
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for(int i = 0 ; i < M ; i++){
		adj[A[i]].push_back({B[i] , T[i]});
		adj[B[i]].push_back({A[i] , T[i]});
	}
	int ans = 0;
	vector<int> v;
	for(int i = 0 ; i < N ; i++){
		if(mark[i])	continue;
		vec = {};
		DFSDown(i);
		DFSUp(i);
		int R = MOD * 2;
		for(int j : vec){
			int cur = max(dpDown[j] , dpUp[j]);
			R = min(R , cur);
			ans = max(ans , cur);
		}
		v.push_back(R);
//		cout << R << endl;
	}
	sort(all(v) , greater<int>());
	if(SZ(v) >= 2)	ans = max(ans , v[0] + v[1] + L);
	if(SZ(v) >= 3)	ans = max(ans , v[1] + v[2] + L + L);
	return ans;
	//cout << N << endl;
	//for(int i = 0 ; i < N ; i++)	cout << i << ' ' << dpDown[i] << ' ' << dpUp[i] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...