Submission #447655

#TimeUsernameProblemLanguageResultExecution timeMemory
447655antontsiorvasDreaming (IOI13_dreaming)C++14
100 / 100
113 ms17988 KiB
#include "dreaming.h"
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;

int cnt, root[100005], dpdown[100005][3], dpup[100005], maxdiam, minv[100005];
vector< pair<int, int> > adj[100005];
bool visited[100005];

void dfsdown(int v, int prev){
	visited[v] = true;
	
	for(int i=0; i<adj[v].size(); i++){
		int next = adj[v][i].first;
		int time = adj[v][i].second;
		if(next == prev) continue;
		dfsdown(next,v);
		int weight = dpdown[next][0] + time;
		if(dpdown[v][0] < weight){
			dpdown[v][1] = dpdown[v][0];
			dpdown[v][0] = weight;
			dpdown[v][2] = next;
		}
		else if(dpdown[v][1] < weight && weight < dpdown[v][0]) dpdown[v][1] = weight;
	}
	
}

void dfsup(int v, int prev, int w){
	dpup[v] = w;
	for(int i=0; i<adj[v].size(); i++){
		int next = adj[v][i].first;
		int time = adj[v][i].second;
		if(next == prev) continue;
		if(next == dpdown[v][2]) dfsup(next,v,max(dpdown[v][1],w)+time);
		else dfsup(next,v,max(dpdown[v][0],w)+time);
	}
}

void dfsfinal(int v, int prev){
	maxdiam = max(maxdiam,max(dpdown[v][0],dpup[v]));
	if(dpdown[v][0] != 0 && dpup[v] != 0) minv[cnt] = min(minv[cnt],max(dpup[v],dpdown[v][0]));
	else if(dpdown[v][0] != 0) minv[cnt] = min(minv[cnt],dpdown[v][0]);
	else if(dpup[v] != 0) minv[cnt] = min(minv[cnt],dpup[v]);
	for(int i=0; i<adj[v].size(); i++){
		int next = adj[v][i].first;
		if(next == prev) continue;
		dfsfinal(next,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(make_pair(B[i],T[i]));
    	adj[B[i]].push_back(make_pair(A[i],T[i]));
	}
	for(int i=0; i<N; i++){
		if(!visited[i]){
			cnt++;
			root[cnt] = i;
			dfsdown(i,-1);
			dfsup(i,-1,0);
			minv[cnt] = dpdown[i][0];
			dfsfinal(i,-1);
		}
	}
//	for(int i=1; i<=cnt; i++) printf("%d ",minv[i]);
	sort(minv+1,minv+cnt+1);
//	for(int i=1; i<=cnt; i++) printf("%d ",minv[i]);
//	for(int i=0; i<N; i++) printf("%d) %d %d %d %d\n",i,dpdown[i][0],dpdown[i][1],dpdown[i][2],dpup[i]);
	if(cnt == 1) return maxdiam;
	if(cnt == 2) return max(maxdiam, minv[cnt]+minv[cnt-1]+L);
	return max(maxdiam, max(minv[cnt]+minv[cnt-1]+L,minv[cnt-1]+minv[cnt-2]+2*L));
//	for(int i=0; i<N; i++) printf("%d) %d %d %d %d\n",i,dpdown[i][0],dpdown[i][1],dpdown[i][2],dpup[i]);
	
}

Compilation message (stderr)

dreaming.cpp: In function 'void dfsdown(int, int)':
dreaming.cpp:15:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |  for(int i=0; i<adj[v].size(); i++){
      |               ~^~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfsup(int, int, int)':
dreaming.cpp:33:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |  for(int i=0; i<adj[v].size(); i++){
      |               ~^~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfsfinal(int, int)':
dreaming.cpp:47:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |  for(int i=0; i<adj[v].size(); i++){
      |               ~^~~~~~~~~~~~~~
#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...