poj 3635 Full Tank? ( 图上dp )
题意:
已知每一个点的加油站的油价单位价格(即点权)。每条路的长度(边权)。
有q个询问。每一个询问包含起点s、终点e和油箱容量。
问从起点走到终点的最小花费。假设不可达输出impossible,否则输出最小的旅途费用。
算法:
事实上要分析状态= =感觉就像是dp。
最直接的想法是 每到一个点都加上要走到下一个点所须要的油量。可是走的路不同,究竟怎么处理加多少的问题呢?
因此想到分解状态。即拆点。每到一个点都+1单位的油量,然后把这个状态增加队列。另外假设如今油箱内的油足够达到下一点,
则更新状态,把新状态增加优先队列。
dp[i][j]表示到第i个城市剩余油量为j的花费。
简单的说。就是优先队列优化的最短路算法多了一维。
为了把全部可能的状态考虑到。
每到一个点仅仅有两种操作:1、加一单位的油 2、更新能走到的下一个点。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxm 10010
#define maxn 1010 using namespace std; struct Edge
{
int to,val,next;
}edge[maxm*2]; struct node
{
int id,cost,oil;
bool operator <(const node &b) const
{
return cost > b.cost;
}
};
bool vis[maxn][110];
int cnt,head[maxn],dp[maxn][110],ans,st,ed,cap,p[maxn];
priority_queue<node> q; void add(int x,int y,int z)
{
edge[cnt].to = y;
edge[cnt].val = z;
edge[cnt].next = head[x];
head[x] = cnt++;
} bool bfs()
{
memset(dp,0x3f,sizeof(dp));
memset(vis,0,sizeof(vis));
while(!q.empty())
q.pop();
int id,oil,cost;
ans = 0; dp[st][0] = 0;
node now,cur,next;
now.id = st;
now.cost = 0;
now.oil = 0;
q.push(now);
while(!q.empty())
{
cur = q.top();
q.pop();
id = cur.id,oil = cur.oil,cost = cur.cost;
if(id == ed)
{
ans = cost;
return true;
}
if(vis[id][oil]) continue;
vis[id][oil] = true;
if(oil < cap)
{
next.id = id;
next.cost = cost+p[id];
next.oil = oil+1;
if(dp[next.id][next.oil]>next.cost && !vis[next.id][next.oil])
{
dp[next.id][next.oil] = next.cost;
q.push(next);
}
}
for(int i=head[id];i!=-1;i = edge[i].next)
{
int u = edge[i].to;
int w = edge[i].val;
if(oil>=w && dp[u][oil-w]>cur.cost && !vis[u][oil-w])
{
next.oil = oil-w;
next.id = u;
next.cost = cost;
dp[u][next.oil] = next.cost;
q.push(next);
}
}
}
return false;
} int main()
{
int n,m,u,v,l,que;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-1,sizeof(head));
cnt = 0; for(int i=0;i<n;i++)
scanf("%d",&p[i]);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&l);
add(u,v,l);
add(v,u,l);
}
scanf("%d",&que);
while(que--)
{
scanf("%d%d%d",&cap,&st,&ed);
if(bfs())
printf("%d\n",ans);
else printf("impossible\n");
}
}
return 0;
}
poj 3635 Full Tank? ( 图上dp )的更多相关文章
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- zoj1232Adventure of Super Mario(图上dp)
题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...
- POJ 3635 Full Tank? 【分层图/最短路dp】
任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- poj 3635 Full Tank? ( bfs+dp思想 )
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5857 Accepted: 1920 Descri ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- 洛谷 P2656 (缩点 + DAG图上DP)
### 洛谷 P2656 题目链接 ### 题目大意: 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...
- Codeforces 918D MADMAX 图上dp 组合游戏
题目链接 题意 给定一个 \(DAG\),每个边的权值为一个字母.两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 \(\geq\) 上一次的权 ...
- [POJ 3635] Full Tank?
题目 Description 已知每个点的加油站的油价单价(即点权),每条路的长度(边权). 有q个询问,每个询问包括起点s.终点e和油箱容量c. 问从起点走到终点的最小花费.如果不可达输出impos ...
- [Luogu P3119] [USACO15JAN]草鉴定Grass Cownoisseur (缩点+图上DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3119 Solution 这题显然要先把缩点做了. 然后我们就可以考虑如何处理走反向边的问题. 像我这样的 ...
随机推荐
- Java核心 --- 泛型
CoreJava 泛型 java泛型的出现避免了强制类型转换,便于代码更好的被阅读 本文的写作参照了张孝祥的泛型介绍:http://www.itcast.cn/news/dbfd20f1/f4b1/4 ...
- python中类的总结
1. 类中的方法 在类里主要有三种方法: a.普通方法:在普通方法定义的时候,需要一个对象的实例参数,从而在类中定义普通方法的时候,都必须传送一个参数self,那么这个参数也就是object b.类方 ...
- Intent相关
Intent是什么? 翻译为:意图,目的(名词) 其实根本没必要管它是什么,看看它能做什么就好了. 不过后来我知道了,它就是个机制----通信机制-----android的许多组件间的交流要依赖它. ...
- Scrum概述
• 敏捷方法是一类软件开发流程的泛称: • 敏捷方法是相对于传统的瀑布式软件过程提出的: • 敏捷方法可以用敏捷宣言(4条).敏捷原则(12条)来概括: • 敏捷原则通过一系列的敏捷实践来体现出来: ...
- C语言基础(不断更新)
1.memcpy. memmove.memccpy的区别 字符串函数功能查询 memcpy要求源串和目的串不能重叠 memccpy:copy直至遇到由参数指定的ch. memmove: 源串和目的串可 ...
- [转]Centos配置国内yum源
原文地址:http://blog.chinaunix.net/uid-23683795-id-3477603.html 网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常 ...
- air for ios
在 Adobe AIR 中为不同屏幕尺寸的多种设备提供支持 使用Flash Builder 4.5进行多平台游戏开发 手机屏幕触控技术与提升AIR在Android上的触控体验 AIR Native E ...
- .net 数据库连接池超时问题
一.数据库Connection Pool 连接池是什么 每当程序需要读写数据库的时候.Connection.Open()会使用ConnectionString连接到数据库,数据库会为程序建立 一个连接 ...
- php 扩展apc 参数优化
编辑php.ini 输入下面 [apc] apc.enabled=1apc.shm_segments = 1apc.shm_size = 1Gapc.ttl = 0apc.user_ttl = 0ap ...
- 轻松学Shell之认识正规表达式
离线下载观看:http://down.51cto.com/data/148117 650) this.width=650;" onclick='window.open("htt ...