洛谷 P4009 汽车加油行驶问题 (分层图最短路)

该博客详细介绍了如何解决洛谷P4009题目,涉及汽车在网格中行驶的费用问题。通过建立分层图并应用最短路算法,处理汽车行驶、加油和增设油库的费用。汽车每经过一条网格边,可能产生费用B,加油费用A,增设油库费用C。汽车满油状态可行驶K条边。解题思路包括根据费用分层,从满油状态开始,逐层构建有向边,考虑不同条件下的边权设置。
摘要由CSDN通过智能技术生成

link

题目要满足三个条件:
1:汽车经过一条网格边时,若其 X 坐标或 Y 坐标减小,则应付费用 B ,否则免付费用。

2:汽车在行驶过程中遇油库则应加满油并付加油费用 A。

3:在需要时可在网格点处增设油库,并付增设油库费用 C(不含加油费用A )。

4:汽车只能沿网格边行驶,装满油后能行驶 K 条网格边。

思路:这题是洛谷网络流24题里的,但是题解都是清一色的最短路哈哈。建图跑最短路。根据费用分层,因为装满油只能走k次,所以我们分为k+1层,第0层代表满油,第一层代表消耗了一单位油。

对于第一个条件:我们在这层连一条有向边到上一层跟他相邻的四个方向,如果x或者y坐标减少,边权为b,否则边权为0。

对于第二个条件:因为遇到油库就强制必须加油,所以,对于第一层及其以上的层连接一条边到第一层,边权为A,此时还需要连接第0层与第一层,但是不要连接其他层,这是因为,如果经过这个点,他下一步只可能是第一层,不可能是其他层。

对于第三个条件:如果这个点不是油库,每一层都连一条边到第一层,边权为a+c,代表在这个点新建了一个油库。

第四个条件:建分层图

#include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;

const int maxn = 1e6+10;
int d[maxn],vis[maxn],n;
vector<pi>G[maxn];

int id(int x,int y,int k)
{
   
	return n*n*k + ((x-1)*n) + y;
}
void add(int u,int v,int w)
{
   
	G[u].pb(mk(v,w));
}

void dij(int s)
{
   
	priority_queue<pi>q;
	memset(d,0x3f,sizeof(d));
	d[s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值