88分求助
查看原帖
88分求助
178480
hjxhjx楼主2021/3/16 19:17
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
	int sum=0;
	bool neg=0;
	char ch=getchar();
	while(ch<'0' || '9'<ch){
		if(ch=='-') neg=1;
		ch=getchar();
	}
	while('0'<=ch && ch<='9'){
		sum=(sum<<1)+(sum<<3)+(ch^'0');
		ch=getchar();
	}
	return neg?-sum:sum;
}

int n,k,A,B,C;

int Map[105][105];
int dis[105][105][15];
bool vis[105][105][15];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

struct node{
	int x,y;
	int fuel;
	int dis;
	node(int xx,int yy,int ff,int cc){
		x=xx;
		y=yy;
		fuel=ff;
		dis=cc;
	}
	node();
	friend bool operator <(node a,node b){
		return a.dis>b.dis;
	}
};
priority_queue<node>q;
void bfs(){
	memset(dis,127,sizeof(dis));
	q.push(node(1,1,k,0));
	dis[1][1][k]=0;
	while(!q.empty()){
		node now=q.top();
		q.pop();
		
		int fuel=now.fuel;
		
		if(vis[now.x][now.y][fuel]) continue;
		vis[now.x][now.y][fuel]=1;
		
		if(fuel == 0){
			if(now.dis+A+C < dis[now.x][now.y][k]){
				q.push(node(now.x,now.y,k,now.dis+A+C));
				dis[now.x][now.y][k]=now.dis+A+C;
			}
			continue;
		}
		
		for(int i=0;i<4;i++){
			int nx=now.x+dir[i][0];
			int ny=now.y+dir[i][1];
			
			int tmp1=now.dis;
			int tmp2=now.dis+A;
			if(i>=2){
				tmp1+=B;
				tmp2+=B;
			}
			
			if(nx<1 || nx>n || ny<1 || ny>n) continue;
			
			if(Map[nx][ny]==0 && tmp1 < dis[nx][ny][fuel-1]){
				dis[nx][ny][fuel-1]=tmp1;
				q.push(node(nx,ny,fuel-1,tmp1));
			}
			
			if(Map[nx][ny]==1 && tmp2 < dis[nx][ny][k]){
				dis[nx][ny][k]=tmp2;
				q.push(node(nx,ny,k,tmp2));
			}
		}
	}
	return;
}

signed main(){
	n=read(),k=read(),A=read(),B=read(),C=read();
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			Map[i][j]=read();
		}
	}
	
	bfs();
	
	int ans=INT_MAX;
	
	for(int i=1;i<=k;i++){
		ans=min(ans,dis[n][n][i]);
	}
	printf("%lld",ans);
	return 0;
}

萌新调不出来qaq

Link

2021/3/16 19:17
加载中...