lightoj 1254 - Prison Break
来源:互联网 发布:德邦统计分析员 知乎 编辑:程序博客网 时间:2024/06/08 05:02
题目链接:http://lightoj.com/volume_showproblem.php?problem=1254
分析题意:说的是个凡人的逃跑,有辆汽车,其邮箱容量是cap<=100。然后有n个城市,m条城市之间的距离,汽车的耗油量是1:1的。开始油箱里面是没有油的,有Q个询问,从u到v油箱的容量为cap的时候的最小花费,不能到达就输出impossible,否则输出最小花费。
这个就是多状态的最短路,据基础题。
设定状态dis[u][r]表示到达u点汽车剩余油量为r时的最小费用。在就是对于每个城市要存的数据的,剩余油量,及对应的花费,然后就是点的标号。(i,j,k),优先队列中以费用小的优先。
typedef<pair<int,int>, int> iii;
/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <climits>using namespace std;#define MEM(x,y) memset(x, y,sizeof x)#define pk push_backtypedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> ii;typedef pair<ii,int> iii;const double eps = 1e-10;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int maxn =1e3 + 10;vector<ii> G[maxn];int n,m;int cap;int dis[maxn][110];int cost[maxn];int solve(int st,int ed){ priority_queue<iii, vector<iii>, greater<iii> > que; memset(dis, 0x7f, sizeof dis); dis[st][0] = 0; int ret = 0; que.push(iii(ii(dis[st][0], 0), st)); while(!que.empty()){ iii now = que.top(); que.pop(); int u = now.second; int w = now.first.first; int r = now.first.second; if (w > dis[u][r]) continue; if (u == ed) return dis[u][r]; int size = G[u].size(); for (int i = 0;i < size;++i){ int v = G[u][i].first; int len = G[u][i].second; if (len > cap) continue; if (r >= len && dis[v][r - len] > dis[u][r]){ dis[v][r - len] = dis[u][r]; que.push(iii(ii(dis[v][r - len], r - len), v)); } } if (r < cap){ dis[u][r + 1] = dis[u][r] + cost[u]; que.push(iii(ii(dis[u][r + 1], r + 1), u)); } } return INF;}int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int t, icase = 0; cin >> t; while(t--){ cin >> n >> m; for (int i = 0;i < n;++i) cin >> cost[i]; int u, v, w; for (int i = 0;i < n;++i) G[i].clear(); for (int i = 0;i < m;++i){ cin >> u >> v >> w; G[u].push_back(ii(v, w)); G[v].push_back(ii(u, w)); } printf("Case %d:\n", ++icase); int Q; cin >> Q; // cout << "Q = " << Q << endl; while(Q--){ cin >> cap >> u >> v; int ans = solve(u, v); if (ans == INF) puts("impossible"); else cout << ans << endl; } } return 0;}
0 0
- lightoj 1254 - Prison Break
- Lightoj 1254 Prison Break
- LightOJ - 1254 Prison Break(最短路+大剪枝)
- Prison Break
- 《Prison Break》
- Prison Break
- Prison Break
- Prison Break
- Prison break
- Prison Break
- Prison Break
- Ending Prison Break(越狱)
- Prison Break中的经典台词
- Prison.Break.Season2.EP14
- hdu 3511 Prison Break
- hdoj 3681 Prison Break
- HDU 3681 - Prison Break
- scau 10306 Prison break
- 读取含中文字符的txt文档python代码
- CharSequence类型数据跨进程传递
- (安全系列一)Android Apk反编译得到Java源代码
- java-ThreadLocal的实现
- 图的基础算法-广度优先搜索/深度优先搜索
- lightoj 1254 - Prison Break
- 谈谈你遇到的伪命题
- Cursor类的一个例子
- 正向代理 & 反向代理
- makefile中eval的简单实例
- 刚踏上管理岗位,如何短时间树立威信,快速提高领导力?
- Swift 属性
- Simplified install with vagrant
- leetcode 322. Coin Change