Submission #1362316

#TimeUsernameProblemLanguageResultExecution timeMemory
1362316duyanhchupapiCyberland (APIO23_cyberland)C++20
100 / 100
2897 ms159184 KiB
#include <bits/stdc++.h>
#define vi vector <int> 
#define pdi pair<double, pair<int,int>> 
// #define double long double

using namespace std;
using ll = long long;

const int N = 1e5 + 5, base = 70;
const double inf = 1e18;

bool vis[N];
vi g[N], luu;
int n, m, k, h, x[N], y[N], c[N], arr[N];
double dist[N][base + 1];

void dfs(int u) {
	if (arr[u] == 0) luu.push_back(u);
	vis[u] = 1; 
	for (int id : g[u]) {
		int v = x[id]; 
		if (v == u) v = y[id]; 
		if (!vis[v]) {
			if (v != h) dfs(v);
			else vis[v] = 1;
		}
	}
}

double solve(int N, int M, int K, int H, vi X, vi Y, vi C, vi ARR) {
	n = N;
	m = M;
	k = min(K, base);
	h = H;
	luu.clear();
	fill(vis, vis + n, 0);
	for (int i = 0; i < n; ++i) {
		g[i].clear();
		arr[i] = ARR[i];
		for (int j = 0; j <= k; ++j) dist[i][j] = inf;
	}
	
	for (int i = 0; i < m; ++i) {
		x[i] = X[i];
		y[i] = Y[i];
		c[i] = C[i];
		g[x[i]].push_back(i);
		g[y[i]].push_back(i); 
	}
	dfs(0); 
	if (!vis[h]) return -1;
	
	priority_queue <pdi,vector<pdi>,greater<pdi>> pq;
	
	dist[0][0] = 0;
	pq.push({0, {0, 0}});
	for (int v : luu) {
		dist[v][0] = 0;
		pq.push({0, {v, 0}});
	}
	
	while (!pq.empty()) {
		double D = pq.top().first;
		int u = pq.top().second.first;
		int lap = pq.top().second.second;
		pq.pop();
		if (D != dist[u][lap]) continue;
		
		for (int id : g[u]) {
			int v = x[id];
			if (v == u) v = y[id];
			double W = D + c[id];
			if (W < dist[v][lap]) {
				dist[v][lap] = W;
				if (v != h) pq.push({W, {v, lap}});
			}
			
			if (arr[v] == 2 && lap < k) {
				W /= 2;
				if (W < dist[v][lap + 1]) {
					dist[v][lap + 1] = W;
					if (v != h) pq.push({W, {v, lap + 1}});
				}
			}
		}	
	}

	double ans = inf;
	for (int i = 0; i <= k; ++i) ans = min(ans, dist[h][i]);
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...