HDU 4318 Power transmission 最长路 (dijkstra + 优先队列) 水
2013-10-04 23:21
417 查看
/** * 水最长路: * 题目要求损失量,不过可以转换成残留量,求最长路。 * 用的是优先队列优化的dijkstra,不优化的话,O(n^2)的估计会T * 具体思路就是:先转换边权,把损失百分比转换成剩余百分比。。就是100%-x% * 在找最长路的时候就是不断相乘,因为百分比不会超过100%所以dijkstra用优先队列 * 优化的思想是成立的。 */ #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <queue> #include <map> #include <vector> #include <algorithm> #define DEBUG 0 #define INF 0x1fffffff #define MAXN 50005 typedef long long LL; using namespace std; int vis[MAXN]; double dis[MAXN], sum; int n, st, ed; struct Edge { int v; double w; Edge() {} Edge(int vv, double ww) {v = vv; w = ww; } }; vector<Edge> ver[MAXN]; struct Node { int v; double w; Node() {} Node(int vv, double ww) {v = vv ; w = ww; } bool operator < (const Node &a ) const { return w < a.w; } }; priority_queue<Node> pq; void dijkstra() { while(!pq.empty()) pq.pop(); for(int i = 1; i <= n; i ++) { vis[i] = 0; dis[i] = -1.0; } pq.push(Node(st, sum)); while(!pq.empty()) { Node cur = pq.top(); pq.pop(); int u = cur.v; double tot = cur.w; if(vis[u]) continue; dis[u] = tot; vis[u] = 1; for(int i = 0; i != ver[u].size(); i ++) { int v = ver[u][i].v; double curW = ver[u][i].w; if(dis[v] < tot * curW) { dis[v] = tot * curW; pq.push(Node(v, dis[v])); } } } } void creat() { for(int i = 1; i <= n; i ++) ver[i].clear(); for(int i = 1; i <= n; i ++) { int c; scanf("%d", &c); for(int j = 0; j < c; j ++) { int v; double w; scanf("%d%lf", &v, &w); ver[i].push_back(Edge(v, (100.0 - w)/100.0)); } } } int main() { while(scanf("%d", &n) != EOF) { creat(); scanf("%d%d%lf", &st, &ed, &sum); dijkstra(); if(dis[ed] == -1) printf("IMPOSSIBLE!\n"); else printf("%.2lf\n", sum - dis[ed]); } return 0; }
相关文章推荐
- HDU 4318 Power transmission (dijkstra && 邻接表从队友那里抄来的,当作模板吧)
- HDU 4318 Power transmission(最短路)
- HDU 4318 Power transmission(最短路变形)
- hdu 4318 Power transmission(最短路)
- HDU-4318 Power transmission 模型转化
- hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题
- hdu - 4318 - Power transmission - 最短路+贪心
- HDU 1874-畅通工程续(最短路Dijkstra+优先队列)
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- priority_queue && Dijkstra 对优先队列优化的Dijkstra算法的理解 hdu 3790
- hdu 5521 Meeting(优先队列+dijkstra)(建图思想)
- hdu 2066 一个人的旅行 Dijkstra+优先队列优化
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- hdu 5521 Meeting(优先队列+dijkstra)(建图思想)
- hdu 2544 最短路(Dijkstra 邻接表+优先队列)
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- hdu 5521 Meeting(优先队列+dijkstra)(建图思想)
- dijkstra(优先队列) HDU 1874
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- hdu 5521 Meeting(优先队列+dijkstra)(建图思想)