汽车加油
题目描述

解题思路
我们可以跑 s p f a spfa spfa ,模拟题目要求,贪心取最小值即可。
code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int xn[5]={0,0,1,0,-1};
const int yn[5]={0,1,0,-1,0};
const int mod=1e7+7;
int n,k,a,b,c;
int map[110][110];
int num[110][110][101];
struct abc{
int x,y,z,s;
}f[10000000];
void spfa()
{
memset(num,0x3f3f3f3f,sizeof(num));
int hd=0,tl=1,hd1=0,tl1=1;
f[1].x=f[1].y=1,f[1].z=k;
while(hd1<tl1)
{
hd=hd%mod+1,hd1++;
int xx=f[hd].x;
int yy=f[hd].y;
if(f[hd].z==0)
f[hd].s+=c+a,f[hd].z=k;
// cout<<xx<<" "<<yy<<endl;
for(int i=1;i<=4;i++)
{
int x=xx+xn[i];
int y=yy+yn[i];
if(x<1||x>n||y<1||y>n)
continue;
if(map[x][y])
{
tl=tl%mod+1,tl1++;
f[tl].x=x;
f[tl].y=y;
f[tl].z=k;
f[tl].s=f[hd].s+a;
if(i>2)
f[tl].s+=b;
if(f[tl].s>=num[x][y][k])
tl--,tl1--;
else
num[x][y][k]=f[tl].s;
}
else
{
tl=tl%mod+1,tl1++;
f[tl].x=x;
f[tl].y=y;
f[tl].s=f[hd].s;
f[tl].z=f[hd].z-1;
if(i>2)
f[tl].s+=b;
if(f[tl].s>=num[x][y][f[tl].z])
tl--,tl1--;
else
num[x][y][f[tl].z]=f[tl].s;
}
}
}
}
int main()
{
cin>>n>>k>>a>>b>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
spfa();
int ans=0x3f3f3f3f;
for(int i=0;i<=k;i++)
ans=min(ans,num[n][n][i]);
cout<<ans<<endl;
}

本文介绍了一个关于汽车加油的最短路径问题,通过解析题目描述,提出使用SPFA算法进行求解,结合贪心策略选择最优的加油方案。
556

被折叠的 条评论
为什么被折叠?



