Submission #388613

#TimeUsernameProblemLanguageResultExecution timeMemory
388613VlatkoCrocodile's Underground City (IOI11_crocodile)C++17
100 / 100
705 ms77352 KiB
#include "crocodile.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pli = pair<ll, int>;

const ll inf = 1e18;

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {

	vector<pli> adj[N];

	for (int i = 0; i < M; ++i) {
		adj[R[i][0]].emplace_back(L[i], R[i][1]);
		adj[R[i][1]].emplace_back(L[i], R[i][0]);
//		cout << "edge " << R[i][0] << " - " << R[i][1] << " with weight " << L[i] << "\n";
	}

	priority_queue<pli, vector<pli>, greater<pli>> pq;
	bool vis[N];
	ll d1[N], d2[N];

	for (int i = 0; i < N; ++i) {
		vis[i] = false;
		d1[i] = d2[i] = inf;
	}

	for (int i = 0; i < K; ++i) {
		int s = P[i];
//		cout<<"source "<<s<<"\n";
		d1[s] = d2[s] = 0;
		pq.emplace(0, s);
	}

	while (!pq.empty()) {
		int u = pq.top().second;
		pq.pop();
		if (vis[u]) continue;
		vis[u] = true;
//		cout<<"u="<<u<<" d1="<<d1[u]<<" d2="<<d2[u]<<"\n";
		for (pli to : adj[u]) {
			int v = to.second;
			ll alt = d2[u] + to.first;
//			cout<<"  v="<<v<<" w="<<to.first<<" alt="<<alt<<"\n";
			if (d1[v] == d2[v]) {
				if (alt < d1[v]) {
					d1[v] = alt;
					pq.emplace(d2[v], v); // might be inf, but that's fine
//					cout<<"  first case\n";
				}
			} else {
				// d1[v] < d2[v]
				if (alt <= d1[v]) {
					d2[v] = d1[v];
					d1[v] = alt;
					pq.emplace(d2[v], v);
//					cout<<"  second case\n";
				} else if (alt < d2[v]) {
					d2[v] = alt;
					pq.emplace(d2[v], v);
//					cout<<"  third case\n";
				}
			}
		}
	}

	return d2[0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...