제출 #983295

#제출 시각아이디문제언어결과실행 시간메모리
983295vjudge1사이버랜드 (APIO23_cyberland)C++17
97 / 100
1396 ms62340 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const ll NMAX = 1e5 + 5;
vector<pair<ll,ll> > g[NMAX];
vector<vector<double> > dis(NMAX, vector<double>(31) );

double solve(int n, int m, int k, int h, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr) {
	for(long long i = 1; i <= n; i++){
		g[i].clear();
		for(long long j = 0; j <= 30; j++) dis[i][j] = DBL_MAX;
	}
	h++;
    for(long long i = 0; i < m; i++){
		g[x[i] + 1].push_back({y[i] + 1, c[i]});
		g[y[i] + 1].push_back({x[i] + 1, c[i]});
	}
	priority_queue<tuple<double,long long,long long>, vector<tuple<double,long long,long long> >, greater<tuple<double,long long,long long> > > q;
	q.push({0, 1, 0});
	dis[1][0] = 0;
	while(!q.empty()){
		auto [dist, v, u] = q.top();
		q.pop();
		
		if(dist > dis[v][u] or v == h) continue;
		
		for(auto [to, cost] : g[v]){
			if(arr[to - 1] == 2 and u < k and ((double)dist + cost) / 2.0 < dis[to][u + 1]){
				dis[to][u + 1] = ((double)dist + cost) / 2.0;
				q.push({dis[to][u + 1], to, u + 1});
			}
			if(arr[to - 1] == 0 and dis[to][u] > 0){
				dis[to][u] = 0;
				q.push({dis[to][u], to, u});
			}
			if(dist + cost < dis[to][u]){
				dis[to][u] = dist + cost;
				q.push({dis[to][u], to, u});
			}
		}
	}
	double ans = DBL_MAX;
	for(long long i = 0; i <= k; i++) ans = min(ans, dis[h][i]);
	if(ans == DBL_MAX) return -1;
	else return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...