UVA 11367 Full Tank?(bfs最短路)
n个点m条无向边的图,油箱有上限,每个单位的汽油能走1单位距离,每个城市的油价val[i], 对于每个query,求s到e的最小花费。
dp[i][j]表示到达第i个城市,油箱剩余油量j时的最小花费。用bfs扩充节点,每个点拆成100个节点,时间复杂度还是可以接受的。
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<fstream>
- #include<sstream>
- #include<bitset>
- #include<vector>
- #include<string>
- #include<cstdio>
- #include<cmath>
- #include<stack>
- #include<queue>
- #include<stack>
- #include<map>
- #include<set>
- #define FF(i, a, b) for(int i=a; i<b; i++)
- #define FD(i, a, b) for(int i=a; i>=b; i--)
- #define REP(i, n) for(int i=0; i<n; i++)
- #define CLR(a, b) memset(a, b, sizeof(a))
- #define debug puts("**debug**")
- #define LL long long
- #define PB push_back
- using namespace std;
- const int maxn = 1010;
- int n, m, val[maxn], dp[maxn][101];
- int Q, C, S, E;
- struct Node
- {
- int u, cost, res;//当前节点,花费,剩余油量
- bool operator < (const Node rhs) const
- {
- return cost > rhs.cost;
- }
- };
- struct Edge
- {
- int to, dist;
- };
- vector<Edge> edges;
- vector<int> G[maxn];
- inline void init()
- {
- REP(i, n) G[i].clear(); edges.clear();
- }
- void add(int a, int b, int c)
- {
- edges.PB((Edge){b, c});
- edges.PB((Edge){a, c});
- int nc = edges.size();
- G[a].PB(nc-2); G[b].PB(nc-1);
- }
- void bfs()
- {
- REP(i, n) REP(j, C+1) dp[i][j] = 0;
- priority_queue<Node> q; q.push((Node){S, 0, 0});
- while(!q.empty())
- {
- Node x = q.top(); q.pop();
- int u = x.u, cost = x.cost, res = x.res, nc = G[x.u].size();
- if(u == E)
- {
- printf("%d\n", cost);
- return ;
- }
- //考虑当前状态,再多加一点油是否会是更优解
- if(res<C && (dp[u][res+1]==0 || dp[u][res+1]>cost+val[u]))
- dp[u][res+1] = cost+val[u],q.push((Node){u,dp[u][res+1],res+1});
- REP(i, nc)
- {
- int v = edges[G[u][i]].to, dist = edges[G[u][i]].dist;
- if(res < dist) continue; //如果油量不够走到下一个节点就continue
- //如果靠当前油量走到下一个节点会是更优解
- if(dp[v][res-dist] == 0 || dp[v][res-dist] > cost)
- dp[v][res-dist] = cost, q.push((Node){v, cost, res-dist});
- }
- }
- puts("impossible");
- return ;
- }
- int main()
- {
- while(~scanf("%d%d", &n, &m))
- {
- init();
- REP(i, n) scanf("%d", &val[i]);
- int a, b, c;
- REP(i, m)
- {
- scanf("%d%d%d", &a, &b, &c);
- add(a, b, c);
- }
- scanf("%d", &Q);
- while(Q--)
- {
- scanf("%d%d%d", &C, &S, &E);
- bfs();
- }
- }
- return 0;
- }
UVA 11367 Full Tank?(bfs最短路)的更多相关文章
- UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
- Uva 1600 Patrol Robot (BFS 最短路)
这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...
- UVa 11367 Full Tank? (DP + Dijkstra)
题意:n个城市有m条道路.每个城市的油价不一样,给出起点s和终点t,以及汽车的油箱的容量,求从城市s到城市 t 的最便宜路径. 析:dp[u][i] 表示在第 u 个城市,还剩下 i L升油,一开始用 ...
- UVA 11367 - Full Tank? dijkstra+DP
传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 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 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
随机推荐
- NHibernate示例
1. 下载相关资源: 下载NHibernate.下载地址: http://nhforge.org/Default.aspx 下载微软Northwind示例数据库,下载地址:http://www.mic ...
- vue使用路由判断是否登录
router.beforeEach((to, from, next) => { // console.log('to:' + to.path) if (to.path.startsWith('/ ...
- python爬取人民币汇率中间价
python爬取人民币汇率中间价,从最权威的网站中国外汇交易中心. 首先找到相关网页,解析链接,这中间需要经验和耐心,在此不多说. 以人民币兑美元的汇率为例(CNY/USD),脚本详情如下: wind ...
- Selenium之PhantomJS相关设置
设置PhantomJS请求头 默认情况下: from selenium import webdriver import time driver = webdriver.PhantomJS() driv ...
- CodeForces - 1017C The Phone Number
题面在这里! 一开始有一种构造猜想,可以把答案降到 sqrt(N) 级别. 考虑把 {1,2,...,n} 分成 sqrt(N) 段,每一段是连续的sqrt(N)个数.然后我们倒着把每一段数放上. 比 ...
- HDU 6085 Rikka with Candies(bitset)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6085 [题目大意] 给出一个数组a一个数组b,以及询问数组c, 问对于每个c有多少对a%b=c,答 ...
- 【带修改的主席树】BZOJ1901-Dynamic Rankings
稍后整理笔记.这题数据范围好像有点问题? #include<iostream> #include<cstdio> #include<cstring> #includ ...
- 3524: [Poi2014]Couriers -- 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...
- HDU 5575 Discover Water Tank 并查集 树形DP
题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...
- PAT甲级1098. Insertion or Heap Sort
PAT甲级1098. Insertion or Heap Sort 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.在每次迭代中,插入排序从输入数据中删除一个元素 ...