#include "crocodile.h"
#include <stdio.h>
#include <string.h>
#define N 100000
#define M 1000000
#define N_ (1 << 17)
int n_, hd[N], e[M * 2 + 2], Ln[M * 2 + 2], c[M * 2 + 2]
	, ii, dp[1 + N], tt[N_ << 1], dq[1 + N];
void add(int u, int v, int w)
{
	int i = ++ii;
	e[i] = v, Ln[i] = hd[u], c[i] = w, hd[u] = i;
}
int ij(int i, int j) {
	return dp[i] < dp[j] ? i : j;
}
void pul(int i) {
	tt[i] = ij(tt[i << 1], tt[i << 1 | 1]);
}
void fix(int i) {
	for (i += n_; i >>= 1; )
		pul(i);
}
int travel_plan(int n, int m, int R[][2], int L[], int K, int P[])
{
	for (int i = 0; i < m; ++i)
		add(R[i][0], R[i][1], L[i]), add(R[i][1], R[i][0], L[i]);
	memset(dq, 0x3f, sizeof dq);
	memset(dp, 0x3f, sizeof dp);
	dp[n]++;
	dq[n]++;
	for (int i = 0; i < K; ++i)
		dp[P[i]] = 0, dq[P[i]] = 0;
	for (n_ = 1; n_ < n; n_ <<= 1);
	for (int i = 0; i < n_; ++i)
		tt[i + n_] = i < n ? i : n;
	for (int i = n_ - 1; i >= 1; --i)
		pul(i);
 
	for (int it = 0;; ++it) {
		int u = tt[1];
		if (u == n)
			break;
		tt[u + n_] = n;
		fix(u);
		for (int w, v, j = hd[u]; j; j = Ln[j]) {
			v = e[j], w = c[j];
			if (dq[v] > dp[u] + w) {
				dp[v] = dq[v], dq[v] = dp[u] + w;
				fix(v);
			} else if (dp[v] > dp[u] + w) {
				dp[v] = dp[u] + w;
				fix(v);
			}
		}
	}
  return dp[0];
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |