Submission #926627

#TimeUsernameProblemLanguageResultExecution timeMemory
926627Wansur사이버랜드 (APIO23_cyberland)C++17
97 / 100
1771 ms62292 KiB
#include <bits/stdc++.h>
#define f first
#define s second
#define ent '\n'

using namespace std;
typedef long long ll;
const int mx=1e5+12;

vector<pair<int,int>> g[mx];
double d[mx][61];
bool used[mx];

void dfs(int v){
	used[v]=1;
	for(auto to:g[v]){
		if(!used[to.f]){
			dfs(to.f);
		}
	}
}

double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
	k=min(k,60);
	for(int i=0;i<n;i++){
		g[i].clear();
		used[i]=0;
	}
	for(int i=0;i<m;i++){
		g[x[i]].push_back({y[i],c[i]});
		g[y[i]].push_back({x[i],c[i]});
	}
	used[h]=1;
	dfs(0);
	set<pair<double,pair<int,int>>> s;
	for(int i=0;i<n;i++){
		for(int x=0;x<=k;x++){
			d[i][x]=1e16;
		}
	}
	d[0][0]=0;
	s.insert({0,{0,0}});
	for(int i=0;i<n;i++){
		if(used[i] && arr[i]==0){
			d[i][0]=0;
			s.insert({0,{i,0}});
		}
	}
	while(s.size()){
		int v=s.begin()->s.f,x=s.begin()->s.s;
		s.erase(s.begin());
		if(v==h)continue;
		for(auto To:g[v]){
			int to=To.f;
			long long w=To.s;
			if(d[to][x]>d[v][x]+w){
				s.erase({d[to][x],{to,x}});
				d[to][x]=d[v][x]+w;
				s.insert({d[to][x],{to,x}});
			}
			if(x<k && d[to][x+1]>d[v][x]/2.0+w && arr[v]==2){
				s.erase({d[to][x+1],{to,x+1}});
				d[to][x+1]=d[v][x]/2.0+w;
				s.insert({d[to][x+1],{to,x+1}});
			}
		}
	}
	double ans=1e16;
	for(int x=k;x>=0;x--){
		if(d[h][x]>1e15)continue;
		ans=min(ans,d[h][x]);
		if(arr[h]==2 && x>0 && d[h][x-1]<=1e15)ans=min(ans,d[h][x-1]/2.0);
	}
	if(ans==1e16){
		ans=-1;
	}
	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...