1254 - Prison Break
Time Limit: 2 second(s) | Memory Limit: 32 MB |
Michael Scofield has just broken out of the prison. Now he wants to go to a certain city for his next unfinished job. As you are the only programmer on his gang, he asked your help. As you know that the fuel prices vary in the cities, you have to write a code to help Scofield that instructs him where to take the fuel and which path to choose. Assume that his car uses one unit of fuel in one unit of distance. Now he gives you the starting city s where he starts his journey with his car, the destination city t and the capacity of the fuel tank of his car c, the code should find the route that uses the cheapest fuel cost. You can assume that Scofield's car starts with an empty fuel tank.
Input
Input starts with an integer T (≤ 5), denoting the number of test cases.
Each case starts with a line containing two integers n (2 ≤ n ≤ 100) and m (0 ≤ m ≤ 1000) where n denotes the number of cities and m denotes the number of roads. The next line contains n space separated integers, each lies between 1 and 100. The ith integer in this line denotes the fuel price (per unit) in the ith city. Each of the next m lines contains three integers u v w (0 ≤ u, v < n, 1 ≤ w ≤ 100, u ≠ v) denoting that there is a road between city u and v whose length is w.
The next line contains an integer q (1 ≤ q ≤ 100) denoting the number of queries by Scofield. Each of the next q lines contains the request. Each request contains three integers: c s t (1 ≤ c ≤ 100, 0 ≤ s, t < n) where c denotes the capacity of the tank, s denotes the starting city and t denotes the destination city.
Output
For each case, print the case number first. Then for each query print the cheapest trip from s to t using the car with the given capacity c or 'impossible' if there is no way of getting from s to t with the given car.
Sample Input |
Output for Sample Input |
1 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 |
Case 1: 170 impossible |
思路:最短路+贪心+dp;
dp[i][j]表示到第i个城市,油箱中还剩j油的最小费用;
用Dijkstra来维护,
开始超时了,后来网上看了人家的思路;我开始每到一个点就将所有的状态枚举了出来,这样会导致枚举对答案没有贡献的。
所以我们按贪心策略来枚举,因为,Dijkstra(Elog(n))的算法取出来的点是当前花费最小的情况,
所以如果这个点可以到达下一个点不加油就到更新下一个点,然后如果当前的油量没超过油箱的容量就+1,加入队列,就和广搜差不多的思想,然后,如果到达了目标点,那么这个一定是最小的就跳出,因这个是当前最小的。
1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 #include <cmath>
5 #include <iostream>
6 #include <algorithm>
7 #include <map>
8 #include <queue>
9 #include <vector>
10 using namespace std;
11 typedef long long LL;
12 typedef struct pp
13 {
14 int to;
15 int id;
16 int cost;
17 bool operator<(const pp&cx)const
18 {
19 return cost>cx.cost;
20 }
21 } ss;
22 vector<ss>vec[200];
23 int dp[200][200];
24 bool flag[200][200];
25 priority_queue<ss>que;
26 int dj(int n,int m,int c);
27 int co[200];
28 int main(void)
29 {
30 int i,j,k;
31 scanf("%d",&k);
32 int __ca=0;
33 while(k--)
34 {
35 int n,m;
36 scanf("%d %d",&n,&m);
37 for(i=0; i<200; i++)
38 vec[i].clear();
39 for(i=0; i<n; i++)
40 {
41 scanf("%d",&co[i]);
42 }
43 while(m--)
44 {
45 int x,y,co;
46 scanf("%d %d %d",&x,&y,&co);
47 ss ans;
48 ans.to=y;
49 ans.cost=co;
50 vec[x].push_back(ans);
51 ans.to=x;
52 vec[y].push_back(ans);
53 }
54 int t;
55 printf("Case %d:\n",++__ca);
56 scanf("%d",&t);
57 while(t--)
58 {
59 int c,u,v;
60 scanf("%d %d %d",&c,&u,&v);
61 int ask=dj(u,v,c);
62 if(ask==1e9)
63 printf("impossible\n");
64 else
65 {
66 printf("%d\n",ask);
67 }
68 }
69 }
70 return 0;
71 }
72 int dj(int n,int m,int c)
73 {
74 int i,j,k;
75 memset(flag,0,sizeof(flag));
76 while(!que.empty())
77 {
78 que.pop();
79 }
80 for(i=0; i<200; i++)
81 {
82 for(j=0; j<200; j++)
83 {
84 dp[i][j]=1e9;
85 }
86 }
87 ss ans;
88 ans.to=n;
89 ans.cost=0;
90 dp[n][0]=0;
91 ans.id=0;
92 que.push(ans);
93 while(!que.empty())
94 {
95 ss ak;
96 ak=que.top();
97 if(ak.to==m)
98 return ak.cost;
99 que.pop();
100 if(dp[ak.to][ak.id]<ak.cost||flag[ak.to][ak.id])
101 {
102 continue;
103 }
104 else
105 {
106 flag[ak.to][ak.id]=true;
107 for(i=0; i<vec[ak.to].size(); i++)
108 {
109 ss aa=vec[ak.to][i];
110 {
111 if(ak.id>=aa.cost)
112 { ss dd;
113 if(dp[aa.to][ak.id-aa.cost]>ak.cost)
114 {
115 dp[aa.to][ak.id-aa.cost]=ak.cost;
116
117 dd.to=aa.to;
118 dd.id=ak.id-aa.cost;
119 dd.cost=dp[aa.to][dd.id];
120 que.push(dd);
121 }
122 }
123 if(ak.id<c)
124 { ss ad;
125 ad.id=1+ak.id;
126 ad.to=ak.to;
127 ad.cost=co[ak.to]+ak.cost;
128 if(dp[ad.to][ad.id]>ad.cost)
129 {dp[ad.to][ad.id]=ad.cost;que.push(ad);}
130 }
131 }
132 }
133 }
134 }
135 return 1e9;
136 }
1254 - Prison Break的更多相关文章
- light oj 1254 - Prison Break 最短路
题目大意:n个点m条边的有向图,q次询问c,s,t,表示汽车邮箱容量为c,求从起点s到终点t的最小费用.汽车在每个点可以加任意的油,每个点的单位油价为a[i]. 题目思路:利用最小费优先队列优化最短路 ...
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
- hdu 3681 Prison Break (TSP问题)
Prison Break Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- Prison Break
Prison Break 时间限制: 1 Sec 内存限制: 128 MB提交: 105 解决: 16[提交][状态][讨论版] 题目描述 Scofild又要策划一次越狱行动,和上次一样,他已经掌 ...
- hdu3511 Prison Break 圆的扫描线
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=3511 题目: Prison Break Time Limit: 10000/5000 MS ( ...
- HDU3681 Prison Break
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- HDU 3681 Prison Break(状态压缩dp + BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...
- hdu 3681 Prison Break
http://acm.hdu.edu.cn/showproblem.php?pid=3681 题意:一个n*m的矩阵,'F'是起点.机器人从F出发,走到G可以充电,走到Y关掉开关,D不能走进,要求把所 ...
随机推荐
- 🏆【Alibaba中间件技术系列】「Sentinel技术专题」分布式系统的流量防卫兵的基本介绍(入门源码介绍)
推荐资料 官方文档 官方demo Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护 ...
- 【Linux】【Shell】【Basic】条件测试
1. 数值测试:数值比较 -eq:是否等于: [ $num1 -eq $num2 ] -ne:是否不等于: -gt:是否大于: -ge:是否大于等于: -lt:是否小于: -le:是否小于等于: 2. ...
- Flask + Nginx + uwsgi 部署过程
一.安装Flask 1.itsdangerous tar xvf itsdangerous-0.23.tar.gz cd itsdangerous-0.23/ python setup.py inst ...
- Mysql中replace与replace into的用法讲解
Mysql replace与replace into都是经常会用到的功能:replace其实是做了一次update操作,而不是先delete再insert:而replace into其实与insert ...
- pipeline groovy
目录 一.变量 一.变量 1.直接定义 def x="abc" 2.从脚本执行结果赋值变量 branch = "/jen_script/return-branch.sh ...
- 自动执行Python脚本
一.自动执行Python脚本(前提条件是电脑已安装对应的Python程序) 1.1.win+R-输入cmd在输入where python查看Python的安装位置 C:\Users\ASUS\AppD ...
- java JDK8 时间处理
目录 时间格式化 LocalDate:年月日 LocalTime:时分秒毫秒 LocalDateTime:年月日时分秒 Instant:纳秒时间戳 Duration:两时间间隔 Duration:处理 ...
- 周期性任务(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 话说录入任务信息是件体力活,每个任务都是要一个字一个字码出来滴.要说一个项目文件,任务内容是主体,所以这作为体力活也不冤枉 ...
- Django-利用LogEntry生成操作历史
在开发测试平台的时候,虽然对某些关键功能做了权限设置,但毕竟是公司多人使用,有些数据的配置可能不小心被他人修改但未告知其他使用者,造成了诸多不便.所以决定开发一个操作历史表,可以方便查看数据地改动. ...
- 背水一战——CSP2021/NOIP2021 游记
洛谷 version 转载本文章的其他链接: 1(S00021 提供) 2(Ew_Cors 提供) \[\texttt{2021.9.10} \] 终于开坑了. 笑死,初赛根本还没开始复习,反正初赛也 ...