Submission #658794

#TimeUsernameProblemLanguageResultExecution timeMemory
658794Markomafko972Dreaming (IOI13_dreaming)C++14
100 / 100
99 ms25568 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;

vector< pair<int, int> > v[100005];
int bio[100005];
int prt[100005];
int g[100005];
int da[100005];
vector<int> sol;
vector<int> dj;

int rek(int x, int p) {
	da[x] = 1;

	int rj = max(bio[x], g[x]);
	for (int i = 0; i < (int)v[x].size(); i++) {
		if (v[x][i].X != p) {
			rj = min(rj, rek(v[x][i].X, x));
		}
	}
	return rj;
}

int dfs(int x, int p) {
	bio[x] = 0;
	prt[x] = p;

	for (int i = 0; i < (int)v[x].size(); i++) {
		if (v[x][i].X != p) bio[x] = max(bio[x], dfs(v[x][i].X, x)+v[x][i].Y);
	}

	return bio[x];
}

void dfs2(int x, int p) {
	vector<int> tren;
	for (int i = 0; i < (int)v[x].size(); i++) {
		if (v[x][i].X != p) tren.push_back(bio[v[x][i].X]+v[x][i].Y);
	}
	sort(tren.begin(), tren.end());

	int post = 1;
	if (p == -1) post = 0;
	if ((int)tren.size() >= 2) {
		for (int i = 0; i < (int)v[x].size(); i++) {
			if (v[x][i].X != p) {
				int pos =(int)tren.size()-1;
				if (tren[pos] == bio[v[x][i].X]+v[x][i].Y) pos--;
				g[v[x][i].X] = max(tren[pos]+v[x][i].Y, g[x]+v[x][i].Y);
			}
		}
	}
	else if ((int)tren.size() == 1) {
		if (v[x][0].X != p) g[v[x][0].X] = g[x]+v[x][0].Y;
		else g[v[x][1].X] = g[x]+v[x][1].Y;
	}

	for (int i = 0; i < (int)v[x].size(); i++) {
		if (v[x][i].X != p) dfs2(v[x][i].X, x);
	}
}

int travelTime(int n, int m, int l, int a[], int b[], int c[]) {
	for (int i = 0; i < m; i++) {
		v[a[i]].push_back({b[i], c[i]});
		v[b[i]].push_back({a[i], c[i]});
	}

	memset(bio, -1, sizeof bio);
	for (int i = 0; i < n; i++) {
		if (bio[i] == -1) {
			dfs(i, -1);
			dfs2(i, -1);
		}
	}

	for (int i = 0; i < n; i++) {
		if (da[i] == 0) sol.push_back(rek(i, -1));
	}

	int out = 0;
	sort(sol.begin(), sol.end());
	if (sol.size() >= 2) out = max(out, sol.back()+l+sol[(int)sol.size()-2]);
	if (sol.size() >= 3) out = max(out, sol[(int)sol.size()-2]+2*l+sol[(int)sol.size()-3]);
	
	for (int i = 0; i < n; i++) {
		dj.clear();
		for (int j = 0; j < (int)v[i].size(); j++) {
			if (v[i][j].X != prt[i]) dj.push_back(bio[v[i][j].X]+v[i][j].Y);
		}
		sort(dj.begin(), dj.end());
		reverse(dj.begin(), dj.end());

		if ((int)dj.size() >= 2) out = max(out, dj[0]+dj[1]);
		if (prt[i] != -1) out = max(out, bio[i]+g[i]);
	}

	return out;
}

Compilation message (stderr)

dreaming.cpp: In function 'void dfs2(int, int)':
dreaming.cpp:45:6: warning: variable 'post' set but not used [-Wunused-but-set-variable]
   45 |  int post = 1;
      |      ^~~~
#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...