제출 #405080

#제출 시각아이디문제언어결과실행 시간메모리
405080Antekb꿈 (IOI13_dreaming)C++14
100 / 100
105 ms18372 KiB
#include "dreaming.h"
#include<bits/stdc++.h>
#define st first
#define nd second
using namespace std;
const int N=1e5+5;
const long long INF=1e18;
vector<pair<int, int>> E[N];
bool vis[N];
long long res=0;
long long dol[N], dolid[N], dol2[N];
void dfs(int v){
	vis[v]=1;
	dolid[v]=-1;
	dol[v]=dol2[v]=0;
	for(auto u:E[v]){
		if(!vis[u.st]){
			dfs(u.st);
			if(dol[u.st]+u.nd>dol[v]){
				dol2[v]=dol[v];
				dol[v]=dol[u.st]+u.nd;
				dolid[v]=u.st;
			}
			else if(dol[u.st]+u.nd>dol2[v])dol2[v]=dol[u.st]+u.nd;
		}
	}
	//cout<<v<<" "<<dol[v]<<" "<<dolid[v]<<" "<<dol2[v]<<"\n";
}
long long dfs2(int v, long long maks){
	long long ans=INF;
	vis[v]=1;
	for(auto u:E[v]){
		if(!vis[u.st]){
			if(u.st==dolid[v])ans=min(ans, dfs2(u.st, u.nd+max(maks, dol2[v])));
			else ans=min(ans, dfs2(u.st, u.nd+max(maks, dol[v])));
		}
	}
	ans=min(ans, max(maks, dol[v]));
	res=max(res, maks+dol[v]);
	return ans;
}
int travelTime(int n, int M, int L, int A[], int B[], int T[]) {
	for(int i=0; i<M; i++){
		E[A[i]].push_back({B[i], T[i]});
		E[B[i]].push_back({A[i], T[i]});
	}
	for(int i=0; i<n;i ++){
		if(!vis[i])dfs(i);
	}
	for(int i=0; i<n; i++)vis[i]=0;
	vector<long long > V;
	for(int i=0; i<n; i++){
		if(!vis[i])V.push_back(dfs2(i, 0));
	}
	sort(V.begin(), V.end());
	reverse(V.begin(), V.end());
	//cout<<V.size()<<"\n";
	//for(auto i:V)cout<<i<<" ";
//	cout<<"\n";
	if(V.size()>=2)res=max(res, V[0]+V[1]+L);
	if(V.size()>2)res=max(res, V[1]+V[2]+L+L);
	return res;
}
#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...