传送门: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. mybatis在XML中大于号转义字符

    mybatis在编写sql时不能在XML里直接使用‘<’ 或者是 ‘>’ 在这里需要使用转义字符替换 下面列举常用的xml转义对应: * <           <       ...

  2. Vue自定义指令实现下拉加载:v-loadmore

    和methods平级: directives: { loadmore: {//自定义指令: 下拉加载 bind(el, binding) {    var p = 0;    var t = 0;  ...

  3. HDU 3487(Play with Chain-Splay)[template:Splay]

    Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. iOS动画之模拟音量振动条

    音量振动条 效果图: 假设实现? 创建3个layer.按顺序播放y轴缩放动画 利用CAReplicatorLayer实现 1.什么是CAReplicatorLayer? 一种能够复制自己子层的laye ...

  5. js31---观察者模式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. actionBar-进入界面闪烁问题解决

    问题分析: 主要是因为在开启一个应用的时候,当前界面并不是第一界面,在它之前,还有一个界面启动了,这个界面的唯一目的就是启动主界面,它目的不是显示.虽然如此,但是呢,这个界面的theme因为没有做统一 ...

  7. JavaScript中的global对象,window对象以及document对象的区别和联系

    JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...

  8. count 变量的使用

    count:统计出现的次数,当某种情况发生时,执行 +1 的动作,+1 的动作常置于循环体内.基本结构如下: count = 0 while count < vnum and **: ... c ...

  9. Elasticsearch5.0.1 + Kibana5.0.1 + IK 5.0.1

    Elasticsearch5.0.1 + Kibana5.0.1 + IK 5.0.1安装记录 最近工作需要,开始研究ES,当前ES的最新版本为5.0.1,从之前的2.x的版本号一下升级到5.x,主要 ...

  10. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...