13求调
查看原帖
13求调
494601
gcx12012楼主2023/5/27 15:46
#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rof(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back

using namespace std;
const ll inf=1e15,P=100010,Q=77;
struct ccf{
	ll v,w;
};
vector<ccf >e[P];
int a[P];
int vis[P][Q];
double ans,d[P][Q];
int n,m,k,h;
struct node{
	ll u,t;
};
queue<node >q;

void spfa(){
	For(i,1,n){
		For(j,0,k){
			vis[i][j]=0;
			d[i][j]=inf;
		}
	}
	For(i,0,k) vis[h][i]=1;
	while(!q.empty()) q.pop();
	d[1][0]=0;
	vis[1][0]=1;
	q.push({1,0});
	while(!q.empty()){
		int u=q.front().u,t=q.front().t;
		q.pop();
		vis[u][t]=0;
		if(a[u]==0) d[u][t]=0;
		for(auto &p:e[u]){
			ll v=p.v,w=p.w;
			if(t<k && a[v]==2 && (d[u][t]+(double)w)/2.0<d[v][t+1]){
				d[v][t+1]=(d[u][t]+(double)w)/2.0;
				if(!vis[v][t+1]){
					q.push({v,t+1});
					vis[v][t+1]=1;
				}
			}
			if(d[u][t]+(double)w<d[v][t]){
				d[v][t]=d[u][t]+(double)w;
				if(!vis[v][t]){
					q.push({v,t});
					vis[u][t]=1;
				}
			}
		}
	}
}
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){
	n=N,m=M,k=min(K,70),h=H+1;
	For(i,1,n) e[i].clear();
	For(i,0,m-1){
		e[x[i]+1].pb({y[i]+1,c[i]});
		e[y[i]+1].pb({x[i]+1,c[i]});
	}
	ans=inf;
	For(i,1,n) a[i]=arr[i-1];
	spfa();
	For(i,0,k) ans=min(ans,d[h][i]);
	if(ans==inf) return -1;
	return ans;
}

rt,只过了sub1,2,后面全RE了

2023/5/27 15:46
加载中...