【线性规划与网络流24题】汽车加油行驶问题 分层图

汽车加油行驶问题

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为正, Y轴向下为正,每一个方格边长为 1,如图所看到的。一辆汽车从起点◎出发驶向右下角终点▲,其坐标为( N,N)。在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守例如以下规则:

(1)汽车仅仅能沿网格边行驶,装满油后能行驶 K条网格边。出发时汽车已装满油,在起点与终点处不设油库。

(2)汽车经过一条网格边时,若其 X坐标或 Y坐标减小,则应付费用 B,否则免付费用。

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

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

(5)(1)~(4)中的各数 N、K、A、B、C均为正整数,且满足约束:2 ≤ N ≤ 100,2 ≤ K ≤ 10。设计一个算法,求出汽车从起点出发到达终点的一条所付费用最少的行驶路线。

对于给定的交通网格,计算汽车从起点出发到达终点的一条所付费用最少的行驶路线。

Input

文件的第一行是 N,K,A,B,C的值。第二行起是一个 N*N的 0-1方阵,每行 N个值,至 N+1行结束。方阵的第 i行第 j列处的值为 1表示在网格交叉点( i,j)处设置了一个油库,为 0时表示未设油库。各行相邻两个数以空格分隔。

Output

输出最小费用

Sample Input

9 3 2 3 60 0 0 0 1 0 0 0 00 0 0 1 0 1 1 0 01 0 1 0 0 0 0 1 00 0 0 0 0 1 0 0 11 0 0 1 0 0 1 0 00 1 0 0 0 0 0 1 00 0 0 0 1 0 0 0 11 0 0
1 0 0 0 1 00 1 0 0 0 0 0 0 0

Sample Output

12

Source

网络流24题

题意依旧不加赘述,题解也不难说,就是比裸最短路多几种转移方式,我不说转移方程了,代码写得非常美丽。

1 . 依据方向的不同要有一个费用B。

2 . 加油站问题,即能够把油量转移成满,注意用不用建就可以。

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 105
#define K 15
#define inf 0x3f3f3f3f
using namespace std;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
struct Lux
{
	int k,x,y;
	Lux(int a,int b,int c):k(a),x(b),y(c){}
	Lux(){}
};

int map[N][N],id[N][N],cnt;
int n,p,A,B,C;
int dist[K][N][N];
bool in[K][N][N];
Lux s,t;

int spfa()
{
	int i,vx,vy,fee,fee2;
	queue<Lux>q;
	memset(dist,0x3f,sizeof(dist));
	dist[s.k][s.x][s.y]=0;
	in[s.k][s.x][s.y]=1;
	q.push(s);
	while(!q.empty())
	{
		Lux U=q.front();q.pop();in[U.k][U.x][U.y]=0;
		if(!U.k)continue;//没油了还跑什么
		for(fee=i=0;i<4;i++)
		{
			vx=U.x+dx[i];
			vy=U.y+dy[i];
			if(i==2)fee=B;/*往回走要多付的费用在这里处理了。*/
			if(!id[vx][vy])continue;
			if(!map[vx][vy])
			{
				fee2=C;/*新开油站,准确的说这里的思想是把全图都开成加油站,原加油站强制加油,新加油站不强制,但加油要多付钱*/
				if(U.k&&dist[U.k-1][vx][vy]>dist[U.k][U.x][U.y]+fee)
				{/*由于加油站强制加油,所以不是加油站才干这么转移。*/
					dist[U.k-1][vx][vy]=dist[U.k][U.x][U.y]+fee;
					if(!in[U.k-1][vx][vy])in[U.k-1][vx][vy]=1,q.push(Lux(U.k-1,vx,vy));
				}
			}
			else fee2=0;/*已经有原加油站了就不须要再付额外费用了*/

			if(dist[p][vx][vy]>dist[U.k][U.x][U.y]+A+fee+fee2)
			{/*加油的转移*/
				dist[p][vx][vy]=dist[U.k][U.x][U.y]+A+fee+fee2;
				if(!in[p][vx][vy])in[p][vx][vy]=1,q.push(Lux(p,vx,vy));
			}
		}
	}
	int ret=inf;
	for(i=0;i<=p;i++)ret=min(ret,dist[i][t.x][t.y]);
	return ret;
}

int main()
{
//	freopen("test.in","r",stdin);
	scanf("%d%d%d%d%d",&n,&p,&A,&B,&C);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]),id[i][j]=++cnt;
	s=Lux(p,1,1),t=Lux(0,n,n);
	printf("%d\n",spfa());
	return 0;
}
时间: 2024-10-13 23:56:27

【线性规划与网络流24题】汽车加油行驶问题 分层图的相关文章

【线性规划与网络流24题】孤岛营救问题 分层图

孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形,其南北方向被划分为 N行,东西方向被划分为 M列,于是整个迷宫被划分为 N×M个单元.每一个单元的位置可用一个有序数对 (单元的行号,单元的列号)来表示.南北或东西方向相邻的 2个单元之间可能

[网络流24题] 汽车加油行驶问题

题面: 传送门 思路: 汽车油箱最多只能装10格油,因此可以依据油量建立分层图(共11层),然后spfa跑最短路 不用把每一条边都建出来,用的时候判断就好了 没了 真是披着网络流外衣的最短路啊 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define inf 1000000000 6 using namespace std

网络流24题 之十五 汽车加油行驶问题 分层图

题目大意:给出一张网格图,描述了每个点是否是加油站,然后给出以下规则. 1.油量限制,一次加油之后只能行驶k步,向下行驶和向右行驶的时候不增加花费,否则增加B的花费. 2.在没油的时候,若该点没有加油站,就建立一个加油站.花费C. 3.加油花费A. 思路:分层图.f[i][j][k]表示在(i,j)处油箱中还有k的油的时候的最小花费,然后分三种情况更新. (delta = 往回走的B花费) 1.若当前节点有加油站,就必须加油.到下一个节点是还有k - 1的油量,花费last + A + delt

题解:线性规划与网络流24题 T2 太空飞行计划问题

太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,-In}.实验Ej 需要用到的仪器是I的子集Rj ∈ I.配置仪器Ik的费用为ck美元.实验Ej 的赞助商已同意为该实验结果支付pj 美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收

线性规划与网络流24题第2题 太空飞行计划 最小割

/** 题目: 线性规划与网络流24题第2题 太空飞行计划 最小割 链接:http://www.cogs.pro/cogs/problem/problem.php?pid=727 题意:lv 思路:最大点权独立集(点集中任意两个点没有边相连,且点权和最大)=点权总和-最小点权覆盖集. 将实验和仪器看做节点. 实验放在二分图的左边, s->x, cap = 实验利润. 仪器放在右边, x->t, cap = 仪器费用. 如果实验u的进行需要仪器v,u->v, cap = INF. ans

线性规划与网络流24题 索引

线性规划与网络流24题 可参考 网络流24题分类

【线性规划与网络流 24题】完成度(1/24)

PS:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1.飞行员配对方案问题 2016-04-11 二分图最大匹配问题,更新了一下$Dinic$模板,带上了当前弧优化和多路增广.这道题输出方案有很多种,可是没有special judge,所以没有A,但方案数是对的.合法的输出方案只能用匈牙利算法解决. #include<queue> #include<

【巨坑】【网络流】线性规划与网络流24题

2016.2.21 01.飞行员配对方案问题(习题 8-10) 每一条边连接外籍-国内飞行员,显然是一个二分图,最多出发的飞机数,对应着最多的边匹配. 问题转化为经典的二分图匹配问题,可以用匈牙利或者网络流. 源点和每一个外籍飞行员.每一个国内飞行员和汇点.每个可行的配合之间连接一条容量为1的有向边. 可以派出的最多飞机数就是这个网络的最大流 建图部分代码 1 for(;;){ 2 int a,b,c; 3 a=read();b=read(); 4 if(a==-1&&b==-1) bre

线性规划与网络流24题

诈个尸. 1.飞行员配对方案问题 二分图匹配. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int INF = 1e9; 8 const int maxn = 2e5 + 10; 9 int lv[maxn], it[ma