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

题目大意:

n个城市有m条道路。每个城市的油价不一样,给出起点s和终点t,以及汽车的油箱的容量,求从城市s到城市 t 的最便宜路径。(一开始油箱是空的,你每次可以选择加多少升。假设每单位的距离消耗1L汽油)

思路:

dijkstra的变形。

用优先队列来维护当前花费的最小值。设dp[i][j]为到达城市i的消耗剩余汽油为j升的最小花费。

那么,经过每一站时候,如果到下一站加油可能最优,那么就加。(详见代码)

PS:

其实这个dp算状态转移吧,嗯,也算。不过我怎么觉得更像剪枝- -|||一开始没有TLE了

还有就是路是双向的。。WA了后发现。改了RE了。好吧数组太小。改了就AC了

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=1000+10;
const int MAXM=30000+10;
const int INF=100000+10;
int head[MAXN],len,dis[MAXN],cost[MAXN],n,m;
int dp[MAXN][111]; //设dp[i][j]为到达城市i的消耗剩余汽油为j升的最小花费
struct edge
{
int to,val,next;
}e[MAXM]; void add(int from,int to,int val)
{
e[len].to=to;
e[len].val=val;
e[len].next=head[from];
head[from]=len++;
}
struct state
{
int id,cost,move;
state(int tid,int tcanmove,int tcurcost){id=tid;cost=tcurcost;move=tcanmove;}
bool operator <(const state & x)const {
return cost > x.cost;
}
};
void dijkstra(int contain,int from,int to)
{
memset(dis,0,sizeof(dis));
for(int i=0;i<n;i++)
for(int j=0;j<101;j++)
dp[i][j]=INF; priority_queue<state> q;
q.push(state(from,0,0));
while(!q.empty())
{
state cur=q.top();
if(cur.id==to)
{
printf("%d\n",cur.cost);
return;
}
q.pop();
if(cur.move<contain && dp[cur.id][cur.move+1] > cost[cur.id]+cur.cost) //满了不加,加了比之前的状态花费多不加
{
dp[cur.id][cur.move+1] = cost[cur.id]+cur.cost;
q.push(state(cur.id,cur.move+1,cost[cur.id]+cur.cost));
}
for(int i=head[cur.id];i!=-1;i=e[i].next)
{
int id=e[i].to;
if(cur.move < e[i].val) continue;//不够到下一站
if(dp[e[i].to][cur.move-e[i].val] > cur.cost) // 到下一站的花费比记录的少就走起~
{
dp[e[i].to][cur.move-e[i].val] = cur.cost;
q.push(state(e[i].to,cur.move-e[i].val,cur.cost));
}
}
}
printf("impossible\n");
} int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(head,-1,sizeof(head));
len=0; for(int i=0;i<n;i++)
scanf("%d",&cost[i]);
for(int i=0;i<m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
add(from,to,val);
add(to,from,val);
}
int q;
scanf("%d",&q);
while(q--)
{
int c,s,e;
scanf("%d%d%d",&c,&s,&e);
dijkstra(c,s,e);
}
}
return 0;
}

UVA 11367 - Full Tank? dijkstra+DP的更多相关文章

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

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

  2. UVA 11367 Full Tank?(bfs最短路)

    n个点m条无向边的图,油箱有上限,每个单位的汽油能走1单位距离,每个城市的油价val[i], 对于每个query,求s到e的最小花费. dp[i][j]表示到达第i个城市,油箱剩余油量j时的最小花费. ...

  3. UVA.10066 The Twin Towers (DP LCS)

    UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...

  4. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  5. uva 11367 (Dijkstra+DP)

    题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用.每次给q个查询(起点,终点,油箱容量)问你最小花费是多少. 思路:一道Dijkstra状态的题目.在这种最短路问题中一维的dis数组记录的信息往 ...

  6. POJ3635 Full Tank?(DP + Dijkstra)

    题目大概说,一辆带有一个容量有限的油箱的车子在一张图上行驶,每行驶一单位长度消耗一单位油,图上的每个点都可以加油,不过都有各自的单位费用,问从起点驾驶到终点的最少花费是多少? 这题自然想到图上DP,通 ...

  7. POJ3635 Full Tank?【Dijkstra+DP】

    题意: n个城市之间有m条双向路.每条路要耗费一定的油量.每个城市的油价是固定并且已经给出的.有q个询问,表示从城市s走到e,油箱的容量为c,求最便宜的方案. 思路: 用Dijkstra+Heap即可 ...

  8. UVa 11280 Flying to Fredericton (DP + Dijkstra)

    题意:给出n(2<=n<=100)个城市之间的m(0<=m<=1000)条航线以及对应的机票价格,要求回答一些询问,每个询问是给出最大停留次数S,求从其实城市Calgary到终 ...

  9. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

随机推荐

  1. 如日中天的Uber到底是用什么开发语言做到的?

    Uber将正在蓬勃发展的Go和Node.js这两个语言很好的融合到其系统上面来.Uber的站点可靠性project师Tom Croucher在近期于波兰举行的Node.js互动大会上详尽的对该公司所用 ...

  2. 设置eclipse中的字体大小

  3. 小贝_redis高级应用-安全性

    redis高级应用-安全性 一.为什么redis须要安全性 二.设置redis验证password 三.验证   一.为什么redis须要安全性 1.redis作为数据的存储介质.假设无法保证redi ...

  4. 43.安装npm及cnpm(Windows)

    转自:https://www.cnblogs.com/yominhi/p/7039795.html [工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https:// ...

  5. js中常用的对象—Math的属性和方法

    js中有一个内置对象——Math对象,在有的时候非常有用,我们来分析一下: Math常用属性(注意要大写): E 返回算术常量 e,即自然对数的底数(约等于2.718)LN2 返回 2 的自然对数(约 ...

  6. vue 中表单 [v-bind:true-value="a" v-bind:false-value="b"] 的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. DG应用日志相关操作

    应用archive log: recover managed standby database disconnect;     应用redo logfile: recover managed stan ...

  8. 【DRF认证】

    目录 认证组件的详细用法 本文详细讲述了DRF认证组件的原理以及用法. @ * 源码剖析** 上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的 ...

  9. ubuntu-通配符

    ubuntu下的通配符主要有三个 1.*  这个是匹配任意一个或多个字符 ab1.txt ab2.txt ab3.txt abc.txt 执行命令以及结果如下 zhangshuli@zhangshul ...

  10. Bitmap Image Graphics

    Bitmap Image  Graphics private void DrawImagePointF(PaintEventArgs e){ // Create image.    Image new ...