poj 3635 BFS 最短路变形
来源:互联网 发布:软件调试报告模板 编辑:程序博客网 时间:2024/05/21 10:28
【题目链接】
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16131
【解题报告】
题意比较明确。给定N(N<=1000)个点的图,要求从S到E花费最少。
其中每个点可以加油,给出每个点的油价。一个单位距离消耗一个单位油。车辆有最大储存油量。
可以把这道题目理解为是一个二维的最短路,其中这个“路”在这里并不是两点之间距离,而是两点之间花费值。
而我们在每一个点可以选择加油或者走向下一个点。
因为加油量始终为整数,所以我们可以一次只加一单位油。
设dp[u][f]表示在u节点,当前油量为f的最小花费(可以理解为从s到u的最短路)
那么之后的扩展有两个选择:
1.如果在城市u的顶点dp[u][f]加油更优(假如已经由之前某个城市更新了到这个城市的最小花费),那么我们在u加一单位油。(这是dij求最短路的松弛操作,注意求同存异)
2.可以从城市u转移到城市v。并且由u转移到v更优(同样是松弛操作)。
那么我们就更新v城市状态dp[v][f’],这里f’是u点的油量f减去u-v的路径长度。
【参考代码】
#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn=1e3+1e2;int mp[maxn][maxn];vector<int>link[maxn];int p[maxn];int dp[maxn][110]; //dp[i][j]表示在i点,油量为j时的最小花费int n,m;struct Node{ int pos,fuel,cost; bool operator < ( const Node& rhs )const{ return cost>rhs.cost; }};int BFS( int s, int e, int cap ){ memset( dp, 127, sizeof dp ); Node now; now.pos=s; now.fuel=0,now.cost=0; dp[now.pos][0]=0; priority_queue<Node>q; q.push( now ); while( !q.empty() ) { Node now=q.top(); q.pop(); int u=now.pos; if( u==e )return now.cost; //可以加油并且加油更划算,加上一升油推进队列 if( now.fuel<cap && dp[ u ][ now.fuel+1 ]> dp[u][now.fuel]+p[u] ) { dp[ u ][ now.fuel+1 ]=dp[u][now.fuel]+p[u]; Node rhs; rhs.pos=u; rhs.cost=now.cost+p[ u ]; rhs.fuel=now.fuel+1; q.push( rhs ); } for( int i=0;i<link[u].size();i++ ) { int v=link[u][i]; int nxt=now.fuel-mp[u][v]; if(nxt<0)continue; //可以从u到v这个城市的话,看看划算不划算 if( dp[v][ nxt ]> dp[u][ now.fuel ] ) { dp[v][nxt]=dp[u][ now.fuel ]; Node rhs; rhs.pos=v; rhs.cost=now.cost; rhs.fuel=nxt; q.push( rhs ); } } } return -1;}int main(){ while( cin>>n>>m ) { memset( mp,0,sizeof mp ); for( int i=0;i<n;i++ ) cin>>p[i];//顶点从0开始编号 for( int i=1;i<=m;i++ ) { int u,v,d; cin>>u>>v>>d; mp[u][v]=mp[v][u]=d; link[u].push_back(v); link[v].push_back(u); } int q; cin>>q; for( int i=1; i<=q;i++ ) { int s,e,cap; cin>>cap>>s>>e; int ans=BFS( s,e,cap ); if( ans==-1 )cout<<"impossible\n"; else cout<<ans<<endl; } } return 0;}
0 0
- poj 3635 BFS 最短路变形
- POJ 3635 Full Tank? 最短路变形
- poj 1797 最短路变形
- poj 1797 最短路变形
- poj 1797(最短路变形)
- poj 3013 最短路变形
- poj 3013(最短路变形)
- poj 3126 最短路变形
- POJ 1797 (最短路变形)
- poj 1797 Heavy Transportation (最短路变形)
- poj 1797 最短路变形应用
- 最短路变形 POJ 2253 Frogger
- poj 1724 最短路变形 DFS+剪枝
- POJ 2253 Frogger -- 最短路变形
- POJ-1797(最短路的变形)
- POJ 3013 最短路变形 0.0
- POJ 2253 Frogger(最短路--floyd变形)
- POJ 2253 Frogger(最短路变形)
- Java框架:strurs(1)
- 超级好用的仿recycleview的listview适配器与viewholder封装
- Unable to execute dex: Multiple dex files define Landroid/support/v4/accessibilityservice/Accessibil
- 第四周项目五-用递归方法求解(求n的阶乘)
- final关键字总结-JAVA
- poj 3635 BFS 最短路变形
- 【SSH】 之Hibernate
- STL_排列函数的使用
- R语言中的模型修正函数update
- hdu1496 Equations (hash)
- 永远不要忽视 "粉红色/红色的异样字体" 在你不知道为什么跟你期望偏差那么大的时候,,不要急记得去问问为什么
- 求两个数的最大公约数和最小公倍数
- 音视频编码_笔记
- Hibernate动态查询框架