Full Tank? POJ - 3635 (bfs | 最短路)
After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you visited. Maybe you could have saved some money if you were a bit more clever about where you filled your fuel?
To help other tourists (and save money yourself next time), you want to write a program for finding the cheapest way to travel between cities, filling your tank on the way. We assume that all cars use one unit of fuel per unit of distance, and start with an empty gas tank.
Input
The first line of input gives 1 ≤ n ≤ 1000 and 0 ≤ m ≤ 10000, the number of cities and roads. Then follows a line with n integers 1 ≤ pi ≤ 100, where pi is the fuel price in the ith city. Then follow m lines with three integers 0 ≤ u, v < n and 1 ≤ d ≤ 100, telling that there is a road between u and v with length d. Then comes a line with the number 1 ≤ q ≤ 100, giving the number of queries, and q lines with three integers 1 ≤ c ≤ 100, s and e, where c is the fuel capacity of the vehicle, s is the starting city, and e is the goal.
Output
For each query, output the price of the cheapest trip from s to e using a car with the given capacity, or "impossible" if there is no way of getting from s to e with the given car.
Sample Input
5 5
10 10 20 12 13
0 1 9
0 2 8
1 2 1
1 3 11
2 3 7
2
10 0 3
20 1 4
Sample Output
170
impossible 题意:n个城市,m条路,每个城市有各自的油价,每条路有各自需要的油量,q个问题,每个问题给出c(汽车油箱容积)、s(起始起点)、t(出发地点),问你最小的邮费
思路:对于某的城市, 当 当前油量 小于 c时,可以选择加油,也就是油费+单位油费,油量+1,城市不变;同时如果 当前油量 >= 某条路花费,就可以通过这路去其他城市,这样油费不变,油量-路上油耗,城市变成另一个城市。
因为我们需要一个油费最少的答案,所有需要用优先队列来保证bfs的单调性,也就是最短路,这样当一个城市第一次出队列的时候就是它的最小油费
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
int n,m,q,c,s,t;
typedef pair<int,int> p;
typedef pair<int,pair<int,int> >mp;
int city[1005];
int next[1005];
int cnt;
int vis[1005][105];
struct Node
{
int x,y,val;
int next;
Node(int x=0,int y=0,int val=0,int next=-1):x(x),y(y),val(val),next(next) {}
} node[20005]; void add(int x,int y,int val)
{
node[++cnt].x = x;
node[cnt].y = y;
node[cnt].val = val;
node[cnt].next = next[x];
next[x] = cnt;
} int bfs(int s,int t)
{
memset(vis,0x3f,sizeof(vis));
priority_queue<mp,vector<mp>,greater<mp> >que;
while(!que.empty())
que.pop();
que.push(mp(0,p(0,s)));
while(!que.empty())
{
mp tmp = que.top();
que.pop();
int now = tmp.second.second;
int s = tmp.second.first;
if(vis[now][s] != 0x3f3f3f3f)
continue;
vis[now][s] = tmp.first;
if(now == t)
return s;
if(s < c)
que.push(mp(vis[now][s]+city[now],p(s+1,now)));
for(int i=next[now]; i!=-1; i=node[i].next)
{
int w = node[i].val;
int To = node[i].y;
if(w <= s && vis[now][s] < vis[To][s-w])
{
que.push(mp(vis[now][s],p(s-w,To)));
}
}
}
return -1;
} int main()
{
scanf("%d%d",&n,&m);
memset(next,-1,sizeof(next));
cnt = 0;
for(int i=0; i<n; i++)
{
scanf("%d",&city[i]);
}
for(int i=1; i<=m; i++)
{
int u,v,val;
scanf("%d%d%d",&u,&v,&val);
add(u,v,val);
add(v,u,val);
}
scanf("%d",&q);
for(int i=1; i<=q; i++)
{
scanf("%d%d%d",&c,&s,&t);
int flag = bfs(s,t);
if(flag != -1)printf("%d\n",vis[t][flag]);
else
printf("impossible\n");
}
}
Full Tank? POJ - 3635 (bfs | 最短路)的更多相关文章
- poj 3635(bfs+优先队列)
题目链接:http://poj.org/problem?id=3635 思路:本题主要运用的还是贪心思想,由于要求st->ed的最小花费,那么每经过一个城市,能不加油就尽量不加油,用dp[i][ ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 Full Tank? 【分层图/最短路dp】
任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ 2251 Dungeon Master (BFS最短路)
三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...
- 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流
题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- POJ 1161 Walls(最短路+枚举)
POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...
- UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
随机推荐
- 【Shared Server Mode】测试调整shared_servers参数对数据库的影响
本文来源于:secooler 的 <[Shared Server Mode]测试调整shared_servers参数对数据库的影响> 关于Shared Server模式的配置方法请参见文 ...
- Confluence 6 导入模板的定义
模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...
- UserNotifications ios10 通知使用
通知在ios10 中推荐使用 导入 import UserNotifications 头文件 if #available(iOS 10.0, *) { UNUserNotificationCent ...
- NIO(一)
1.NIO是什么? 是JDK1.4之后推出的一个新的IO操作(netty.mina通讯框架的底层都是NIO实现的连接) 2.NIO和IO的区别(阻塞只会出现在网络通讯中,都是同步) NIO:非阻塞类型 ...
- kali linux 更新问题
1.使用一次更新和升级软件替换 apt-get install && apt -y full -upgrade 之后使用 reboot重启 系统,重启之后 再次使用命令 ap ...
- node.js 框架express关于报错页面的配置
1.声明报错的方法,以及相对应的页面 //把数据库的调用方法配置到请求中 server.use((req, res, next) => { //把数据库存入req中 req.db = db; / ...
- 步步为营-74-Request,Response和server的其他成员
Request 1 Request.UrlReferrer 获取请求的来源 2 Request.UserHostAddress 获取访问者的IP地址 3 Request.Cookies 获取浏览器发送 ...
- 使用Vmware CLI 6.5控制虚拟机,并做快照
1.下载PowerCLI 6.5 http://7dx.pc6.com/wwb5/VMwarePowerCLI65.zip 2. 打开 VMware vSphere PowerCLI 出现 无法加载文 ...
- mybatis_generator_逆向工程的使用笔记
1:解压mybatis_generator_1.3.1.zip文件. 2:把features,pougins文件夹copy到D:\java\eclipse\eclipse目录下(D:\java\ecl ...
- ASP.NET Core Middleware管道介绍
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Use(async (context, ne ...