n个点m条无向边的图,油箱有上限,每个单位的汽油能走1单位距离,每个城市的油价val[i], 对于每个query,求s到e的最小花费。

dp[i][j]表示到达第i个城市,油箱剩余油量j时的最小花费。用bfs扩充节点,每个点拆成100个节点,时间复杂度还是可以接受的。

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<fstream>
  6. #include<sstream>
  7. #include<bitset>
  8. #include<vector>
  9. #include<string>
  10. #include<cstdio>
  11. #include<cmath>
  12. #include<stack>
  13. #include<queue>
  14. #include<stack>
  15. #include<map>
  16. #include<set>
  17. #define FF(i, a, b) for(int i=a; i<b; i++)
  18. #define FD(i, a, b) for(int i=a; i>=b; i--)
  19. #define REP(i, n) for(int i=0; i<n; i++)
  20. #define CLR(a, b) memset(a, b, sizeof(a))
  21. #define debug puts("**debug**")
  22. #define LL long long
  23. #define PB push_back
  24. using namespace std;
  25.  
  26. const int maxn = 1010;
  27. int n, m, val[maxn], dp[maxn][101];
  28. int Q, C, S, E;
  29. struct Node
  30. {
  31. int u, cost, res;//当前节点,花费,剩余油量
  32. bool operator < (const Node rhs) const
  33. {
  34. return cost > rhs.cost;
  35. }
  36. };
  37. struct Edge
  38. {
  39. int to, dist;
  40. };
  41. vector<Edge> edges;
  42. vector<int> G[maxn];
  43.  
  44. inline void init()
  45. {
  46. REP(i, n) G[i].clear(); edges.clear();
  47. }
  48.  
  49. void add(int a, int b, int c)
  50. {
  51. edges.PB((Edge){b, c});
  52. edges.PB((Edge){a, c});
  53. int nc = edges.size();
  54. G[a].PB(nc-2); G[b].PB(nc-1);
  55. }
  56.  
  57. void bfs()
  58. {
  59. REP(i, n) REP(j, C+1) dp[i][j] = 0;
  60. priority_queue<Node> q; q.push((Node){S, 0, 0});
  61. while(!q.empty())
  62. {
  63. Node x = q.top(); q.pop();
  64. int u = x.u, cost = x.cost, res = x.res, nc = G[x.u].size();
  65. if(u == E)
  66. {
  67. printf("%d\n", cost);
  68. return ;
  69. }
  70. //考虑当前状态,再多加一点油是否会是更优解
  71. if(res<C && (dp[u][res+1]==0 || dp[u][res+1]>cost+val[u]))
  72. dp[u][res+1] = cost+val[u],q.push((Node){u,dp[u][res+1],res+1});
  73.  
  74. REP(i, nc)
  75. {
  76. int v = edges[G[u][i]].to, dist = edges[G[u][i]].dist;
  77. if(res < dist) continue; //如果油量不够走到下一个节点就continue
  78. //如果靠当前油量走到下一个节点会是更优解
  79. if(dp[v][res-dist] == 0 || dp[v][res-dist] > cost)
  80. dp[v][res-dist] = cost, q.push((Node){v, cost, res-dist});
  81. }
  82. }
  83. puts("impossible");
  84. return ;
  85. }
  86.  
  87. int main()
  88. {
  89. while(~scanf("%d%d", &n, &m))
  90. {
  91. init();
  92. REP(i, n) scanf("%d", &val[i]);
  93. int a, b, c;
  94. REP(i, m)
  95. {
  96. scanf("%d%d%d", &a, &b, &c);
  97. add(a, b, c);
  98. }
  99. scanf("%d", &Q);
  100. while(Q--)
  101. {
  102. scanf("%d%d%d", &C, &S, &E);
  103. bfs();
  104. }
  105. }
  106. return 0;
  107. }

UVA 11367 Full Tank?(bfs最短路)的更多相关文章

  1. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  2. Uva 1600 Patrol Robot (BFS 最短路)

    这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...

  3. UVa 11367 Full Tank? (DP + Dijkstra)

    题意:n个城市有m条道路.每个城市的油价不一样,给出起点s和终点t,以及汽车的油箱的容量,求从城市s到城市 t 的最便宜路径. 析:dp[u][i] 表示在第 u 个城市,还剩下 i L升油,一开始用 ...

  4. UVA 11367 - Full Tank? dijkstra+DP

    传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  6. 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路

    题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...

  7. 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流

    题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...

  8. BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)

    BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...

  9. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

随机推荐

  1. NHibernate示例

    1. 下载相关资源: 下载NHibernate.下载地址: http://nhforge.org/Default.aspx 下载微软Northwind示例数据库,下载地址:http://www.mic ...

  2. vue使用路由判断是否登录

    router.beforeEach((to, from, next) => { // console.log('to:' + to.path) if (to.path.startsWith('/ ...

  3. python爬取人民币汇率中间价

    python爬取人民币汇率中间价,从最权威的网站中国外汇交易中心. 首先找到相关网页,解析链接,这中间需要经验和耐心,在此不多说. 以人民币兑美元的汇率为例(CNY/USD),脚本详情如下: wind ...

  4. Selenium之PhantomJS相关设置

    设置PhantomJS请求头 默认情况下: from selenium import webdriver import time driver = webdriver.PhantomJS() driv ...

  5. CodeForces - 1017C The Phone Number

    题面在这里! 一开始有一种构造猜想,可以把答案降到 sqrt(N) 级别. 考虑把 {1,2,...,n} 分成 sqrt(N) 段,每一段是连续的sqrt(N)个数.然后我们倒着把每一段数放上. 比 ...

  6. HDU 6085 Rikka with Candies(bitset)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6085 [题目大意] 给出一个数组a一个数组b,以及询问数组c, 问对于每个c有多少对a%b=c,答 ...

  7. 【带修改的主席树】BZOJ1901-Dynamic Rankings

    稍后整理笔记.这题数据范围好像有点问题? #include<iostream> #include<cstdio> #include<cstring> #includ ...

  8. 3524: [Poi2014]Couriers -- 主席树

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...

  9. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  10. PAT甲级1098. Insertion or Heap Sort

    PAT甲级1098. Insertion or Heap Sort 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.在每次迭代中,插入排序从输入数据中删除一个元素 ...