88分P4009汽车加油问题求助
  • 板块题目总版
  • 楼主Danno0v0
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/18 16:10
  • 上次更新2023/11/4 03:23:55
查看原帖
88分P4009汽车加油问题求助
167279
Danno0v0楼主2021/10/18 16:10

rt,调不出来

#include<bits/stdc++.h>
using namespace std;
priority_queue<pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > >heap;
int fi[1000001],nx[6000001],to[6000001],tot,vis[6000001];
long long co[6000001],dis[6000001];
long long n,k,a,b,c;
void link(int a,int b,int c){
	nx[++tot]=fi[a];
	fi[a]=tot;
	to[tot]=b;
	co[tot]=c;
}
int main(){
	int x;
	cin>>n>>k>>a>>b>>c;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>x;
			if(x==0){
				if(i>=1){
					for(int s=k;s>=1;s--){
						link(s*10000+(i-1)*100+j,(s-1)*10000+i*100+j,0);
						link(s*10000+(i-1)*100+j,k*10000+i*100+j,a+c);
					}	
				}
				if(j>=1){
					for(int s=k;s>=1;s--){
						link(s*10000+i*100+j-1,(s-1)*10000+i*100+j,0);
						link(s*10000+i*100+j-1,k*10000+i*100+j,a+c);
					}
				}
				if(i<n-1){
					for(int s=k;s>=1;s--){
						link(s*10000+(i+1)*100+j,(s-1)*10000+i*100+j,b);
						link(s*10000+(i+1)*100+j,k*10000+i*100+j,a+c+b);
					}
				}
				if(j<n-1){
					for(int s=k;s>=1;s--){
						link(s*10000+i*100+j+1,(s-1)*10000+i*100+j,b);
						link(s*10000+i*100+j+1,k*10000+i*100+j,a+c+b);
					}
				}
			}
			else{
				if(i>=1){
					for(int s=k;s>=1;s--){
						link(s*10000+(i-1)*100+j,k*10000+i*100+j,a);
					}	
				}
				if(j>=1){
					for(int s=k;s>=1;s--){
						link(s*10000+i*100+j-1,k*10000+i*100+j,a);
					}
				}
				if(i<n-1){
					for(int s=k;s>=1;s--){
						link(s*10000+(i+1)*100+j,k*10000+i*100+j,a+b);
					}
				}
				if(j<n-1){
					for(int s=k;s>=1;s--){
						link(s*10000+i*100+j+1,k*10000+i*100+j,a+b);
					}
				}
			}
		}
	}
	memset(dis,-1,sizeof(dis));
	heap.push(make_pair(0,k*10000));
	while(!heap.empty()){
		int co_st=heap.top().first;
		int now=heap.top().second;
		heap.pop(); 
		if(vis[now]){
			continue;
		}
		vis[now]=1;
		dis[now]=co_st;
		for(int i=fi[now];i;i=nx[i]){
			int v=to[i];
			if(!vis[i]&&(dis[v]==-1||dis[v]>dis[now]+co[i])){
				dis[v]=dis[now]+co[i];
				heap.push(make_pair(dis[v],v));	
			}
		}
	}
	long long mnn=0x7ffffff;
	for(int i=0;i<=k;i++)	{
		if(dis[i*10000+(n-1)*100+n-1]!=-1){ 
			mnn=min(mnn,dis[i*10000+(n-1)*100+n-1]);
		} 
	}
	cout<<mnn<<endl;
}
2021/10/18 16:10
加载中...