Submission #1322797

#TimeUsernameProblemLanguageResultExecution timeMemory
1322797tkm_algorithmsCrocodile's Underground City (IOI11_crocodile)C++20
46 / 100
5 ms1336 KiB
#include "crocodile.h"
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 1e9+7;
const int NMAX = 1e5+10;
const int inf = 1e9+10;

vector<pair<int, int>> g[NMAX];
bool specific[NMAX];
int mn1[NMAX], mn2[NMAX];
int cnt[NMAX], vis[NMAX];

void dfs(int node, int par) {
	vis[node] = 1; if (specific[node])cnt[node] = 1;
	for (auto [son, weight]: g[node])
		if (!vis[son])dfs(son, node), cnt[node] += cnt[son];
	assert(cnt[node] >= 2|| specific[node] || specific[par]);
}

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[])
{
	memset(specific, false, sizeof specific);
	rep(i, 0, M)
		g[R[i][0]].push_back({R[i][1], L[i]}),
		g[R[i][1]].push_back({R[i][0], L[i]});
		
	rep(i, 0, K)specific[P[i]] = 1;
	rep(i, 0, N)mn1[i] = mn2[i] = inf;
	
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	rep(i, 0, K) {
		mn1[P[i]] = 0;
		pq.push({0, P[i]});
	}
	
	dfs(0, 0);
	
	while (!pq.empty()) {
		auto [dis, node] = pq.top(); pq.pop();
		if (mn2[node] != inf)continue;
		if (dis < mn1[node]) {
			assert(mn1[node] == inf);
			mn1[node] = dis;
		} else {
			mn2[node] = dis;
			for (auto [son, weight]: g[node])
				pq.push({dis+weight, son});
		}
	}
	return mn2[0];
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...