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( ...
随机推荐
- Web框架之Bootstrap
一.Bootstrap简介 Bootstrap,来自Twitter的设计师Mark Otto和Jacob Thornton合作开发,是目前很受欢迎的Web前端开源框架. Bootstrap 是基于HT ...
- android中调用c++文件并转为so
1.新建项目,不选include support c++ 报错:Error:Failed to open zip file.Gradle's dependency cache may be corru ...
- selenium怎么操作web页面常见的元素
总结一下selenium怎么操作web页面常见的元素. 主要有: 上传 alter dialog prompt dialog confirm dialog select list radio box ...
- MySQL之IDE工具介绍及数据备份
一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...
- 给div拼接html 拼接字符串
简单描述:拼接html 拼接字符串,说实话,拼接这种东西我自己弄,得花费很多时间,主要是转义字符,单引号,双引号这种小细节调整起来比较麻烦,一旦疏忽多了少了一个符号,页面就有点抽象了,我呢比较粗枝大叶 ...
- 《剑指offer》 二进制中1的个数
本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...
- phpmyadmin 安装
首先,安装mysql $ sudo apt-get install mysql-server$ sudo apt-get install mysql-client安装时输出root用户的密码在安装ph ...
- java报错:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files
看包的路径是否对对:比如这样不对(...src/object/obietc) 其它解决方法转载: https://www.cnblogs.com/yadongliang/p/5918228.html ...
- django的查看sql语句setting设置
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'cons ...
- Python中字符串的截取,列表的截取
字符串的截取 Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符. 字符串的截取的语法格式如下: 变量[头下标:尾下标] 索引值以 0 为开始值,-1 ...