题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用。每次给q个查询(起点,终点,油箱容量)问你最小花费是多少。

思路:一道Dijkstra状态的题目。在这种最短路问题中一维的dis数组记录的信息往往不能很好的解决问题,所以我们要给dis数组增加维数来使每个状态唯一。这其实就是结合了动态规划的思想,然后考虑每个状态能怎么转移(这其实就是单个结点从队列中弹出来的处理过程)

对于这道题,我们增加一维表示当前汽车的剩油量,然后每个状态有两种转移方式1.直接开去下一个节点2.一格一格加油。最后统计一下目标节点所有油量的花费最小值,就能得出答案了。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <queue>
 5 #include <algorithm>
 6
 7 using namespace std;
 8
 9 typedef pair<int,int> pii;
10 const int maxn = 1005;
11 const int maxm = 105;
12 const int inf = 0x3f3f3f3f;
13
14 int N,M,P[maxn],D[maxn][maxm];//到i点油量为j时的花费
15 int vis[maxn][maxm];
16 vector<pii> G[maxn];
17
18 struct State
19 {
20     int u,l,d;//地点,油量,花费
21     State(int u=0,int l=0,int d=0):u(u),l(l),d(d){}
22     bool operator <(const State & a) const {return d > a.d;}//优先队列从小到大,默认大根堆
23 };
24
25 void init()
26 {
27     for (int i = 0; i < N; i++) {
28         G[i].clear();
29         scanf("%d", &P[i]);
30     }
31
32     int u, v, w;
33     while (M--) {
34         scanf("%d%d%d", &u, &v, &w);
35         G[u].push_back(make_pair(v, w));
36         G[v].push_back(make_pair(u, w));
37     }
38 }
39
40 int dijkstra(int s,int e,int c)
41 {
42     memset(D, inf, sizeof(D));
43     memset(vis, 0, sizeof(vis));
44
45     D[s][0] = 0;
46     priority_queue<State> q;
47     q.push(State(s,0,D[s][0]));
48
49     while(!q.empty())
50     {
51         State cur=q.top(); q.pop();
52
53         int u = cur.u, l=cur.l;
54         if(vis[u][l])continue;
55         vis[u][l]=1;
56
57         for(int i=0;i<G[u].size();i++)
58         {
59             int v=G[u][i].first, w=G[u][i].second;
60             if(w>l)continue;
61             if(D[v][l-w]>D[u][l])
62             {
63                 D[v][l-w]=D[u][l];
64                 q.push(State(v,l-w,D[v][l-w]));
65             }
66         }
67
68         if(l < c && D[u][l+1]>D[u][l]+P[u])//每次加一升
69         {
70             D[u][l+1]=D[u][l]+P[u];
71             q.push(State(u,l+1,D[u][l+1]));
72         }
73     }
74     /*
75     int ret = inf;
76     for (int i = 0; i <= c; i++)
77         ret = min(ret, D[e][i]);
78     return ret;
79     */
80     return D[e][0];
81 }
82
83 int main () {
84     while (scanf("%d%d", &N, &M) == 2) {
85         init();
86         int q, s, e, c;
87         scanf("%d", &q);
88         while (q--) {
89             scanf("%d%d%d", &c, &s, &e);
90             int ans = dijkstra(s, e, c);
91             if (ans == inf) printf("impossible\n");
92             else printf("%d\n", ans);
93         }
94     }
95     return 0;
96 }

转载于:https://www.cnblogs.com/demian/p/9033681.html

uva 11367 (Dijkstra+DP)相关推荐

  1. PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)

    PTA7-12 城市间紧急救援 (25 分) 关于这个题呢,我当时也想了很久没有一点头绪.所以,菜鸡的我一如既往的打开了CSDN(手动滑稽).我看了很多大佬的写法,最普遍的应该就是dijkstra+d ...

  2. Placing Lampposts ,UVa 10859 树形dp

    UVa 10859 日常刷白书,第三次刷dp刷到这题,竟然还是不会写..... 这个题给定n个点m条边的无向无环图,有至多1000个节点,每个节点有两个状态,可以放灯或者不放灯,要求放最少的灯使得所有 ...

  3. uva 10118(DP)

    UVA 10118 题意: 有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果, 如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己 ...

  4. uva 672 - Gangsters(dp)

    题目链接:uva 672 - Gangsters 题目大意:给出n,K,T,表示一个酒店将要有n位客人到来,然后给出每个客人的ti,表示在ti时刻第i位客人来到酒店,ti ≤ T:再给出pi,表示第i ...

  5. 【UVa】【DP】1633 Dyslexic Gollum

    UVa 1633 Dyslexic Gollum 题目 ◇题目传送门◆(由于UVa较慢,这里提供一份vjudge的链接) ◇题目传送门(vjudge)◆ 题目大意 输入正整数N,KN,KN,K,求长度 ...

  6. uva 1424 - Salesmen(dp)

    题目链接:uva 1424 - Salesmen 题目大意:给定一个包含n个点的无向图和一个长度为L的序列A,要求修改尽量少得数,使得序列中的任意两个相邻数相等或者在途中相邻. 解题思路:dp[i][ ...

  7. 2018icpc南京网络赛L题Magical Girl Haz(dijkstra+dp)

    题目链接 题意 有N个城市M条路径,可以使K条路径长度变为0,求1到N最短路 解题思路 求最短路很好求,但是题目多了一个限制条件,可以使K条路径长度变为0,这就有点麻烦了,后来想到,这也有点像01背包 ...

  8. UVA 10564 计数DP

    也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞...不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下, ...

  9. Uva 11600 期望DP

    题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市 ...

最新文章

  1. jyphon 环境变量配置
  2. CF1322B-Present【双指针】
  3. Spring安全–幕后
  4. 【Java】JDBC连接MySQL驱动
  5. Linux系统下的几种终端设备文件
  6. Android开发笔记(三十四)Excel文件的读写
  7. java 并发 异步_Java并发 CompletableFuture异步编程的实现
  8. 苹果iPad忘记了Apple ID密码该怎么办?(手机教程)
  9. HUAWEI OSPF配置
  10. python在视频上方加字_使用moviepy给视频加字遇到的坑
  11. 金融计量模型(十):协整和误差修正模型
  12. 苹果wifi网速慢怎么办_无线WiFi满格网速却很慢怎么办 如何提升网速【详解】
  13. short转换byte
  14. ASP.NET Web API项目自动生成接口文档和测试页面
  15. VC++开发RTX拨打电话插件
  16. 随笔集:H5如何对接原生app的方法
  17. 谷歌高效开发的秘密:来自谷歌前员工的软件开发工具指南
  18. 初识IndexedDB本地存储
  19. class二进制文件解析(一)
  20. C++_enhance-Record11—异常的层次结构(继承在异常中的应用)

热门文章

  1. OpenAPI实现云主机闪电交付最佳实践
  2. 智稳双全--AnalyticDB如何助力菜鸟运配双十一
  3. T级内存,创建效率提升10倍以上,阿里云 KVM异构虚拟机启动时间优化实践
  4. 可折叠Web可能会给我们带来的变化
  5. 如何应对数据库CPU打满?最优解在这里...
  6. 那些年,我在游戏开发中改过的bug:靠不住的OS和SDK
  7. 游戏角色口型老是对不上?这里有一个高效解决方案
  8. 游戏《蔚蓝山》教我的编程道理
  9. ORACLE 临时表空间使用率过高的原因及临时解决方案
  10. Flashback Data Archive(转)