uva 11367 (Dijkstra+DP)
题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用。每次给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)相关推荐
- PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)
PTA7-12 城市间紧急救援 (25 分) 关于这个题呢,我当时也想了很久没有一点头绪.所以,菜鸡的我一如既往的打开了CSDN(手动滑稽).我看了很多大佬的写法,最普遍的应该就是dijkstra+d ...
- Placing Lampposts ,UVa 10859 树形dp
UVa 10859 日常刷白书,第三次刷dp刷到这题,竟然还是不会写..... 这个题给定n个点m条边的无向无环图,有至多1000个节点,每个节点有两个状态,可以放灯或者不放灯,要求放最少的灯使得所有 ...
- uva 10118(DP)
UVA 10118 题意: 有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果, 如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己 ...
- uva 672 - Gangsters(dp)
题目链接:uva 672 - Gangsters 题目大意:给出n,K,T,表示一个酒店将要有n位客人到来,然后给出每个客人的ti,表示在ti时刻第i位客人来到酒店,ti ≤ T:再给出pi,表示第i ...
- 【UVa】【DP】1633 Dyslexic Gollum
UVa 1633 Dyslexic Gollum 题目 ◇题目传送门◆(由于UVa较慢,这里提供一份vjudge的链接) ◇题目传送门(vjudge)◆ 题目大意 输入正整数N,KN,KN,K,求长度 ...
- uva 1424 - Salesmen(dp)
题目链接:uva 1424 - Salesmen 题目大意:给定一个包含n个点的无向图和一个长度为L的序列A,要求修改尽量少得数,使得序列中的任意两个相邻数相等或者在途中相邻. 解题思路:dp[i][ ...
- 2018icpc南京网络赛L题Magical Girl Haz(dijkstra+dp)
题目链接 题意 有N个城市M条路径,可以使K条路径长度变为0,求1到N最短路 解题思路 求最短路很好求,但是题目多了一个限制条件,可以使K条路径长度变为0,这就有点麻烦了,后来想到,这也有点像01背包 ...
- UVA 10564 计数DP
也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞...不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下, ...
- Uva 11600 期望DP
题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市 ...
最新文章
- jyphon 环境变量配置
- CF1322B-Present【双指针】
- Spring安全–幕后
- 【Java】JDBC连接MySQL驱动
- Linux系统下的几种终端设备文件
- Android开发笔记(三十四)Excel文件的读写
- java 并发 异步_Java并发 CompletableFuture异步编程的实现
- 苹果iPad忘记了Apple ID密码该怎么办?(手机教程)
- HUAWEI OSPF配置
- python在视频上方加字_使用moviepy给视频加字遇到的坑
- 金融计量模型(十):协整和误差修正模型
- 苹果wifi网速慢怎么办_无线WiFi满格网速却很慢怎么办 如何提升网速【详解】
- short转换byte
- ASP.NET Web API项目自动生成接口文档和测试页面
- VC++开发RTX拨打电话插件
- 随笔集:H5如何对接原生app的方法
- 谷歌高效开发的秘密:来自谷歌前员工的软件开发工具指南
- 初识IndexedDB本地存储
- class二进制文件解析(一)
- C++_enhance-Record11—异常的层次结构(继承在异常中的应用)