SRM675 medium ShortestPathWithMagic(DP+Dijkstra)
2015-12-18 10:00
232 查看
题意:n个完全图,找出0到1的最短路,其中有k个魔法可以使用,每使用一个,当前道路的长度就会变为原来的一半。
分析:设每个点有k中状态,更新每一个状态的最小值。
代码:
分析:设每个点有k中状态,更新每一个状态的最小值。
代码:
#include <bits/stdc++.h> #include <queue> #include <string> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) using namespace std; const int maxn = 55; const double inf = 1<<30; typedef pair<int,int> pii; struct Node{ double val; int id,w; Node() {} Node(double a,int b,int c) : val(a),id(b),w(c){} bool operator < (const Node& rhs) const{ if(val == rhs.val) return w > rhs.w; return val > rhs.val; } }; double dp[maxn][maxn]; bool vis[maxn][maxn]; class ShortestPathWithMagic{ public : double getTime(vector <string> dist, int k){ int n = dist.size(); memset(vis,false,sizeof(vis)); priority_queue<Node> q; FOR(i,0,maxn) FOR(j,0,maxn) dp[i][j] = inf; dp[0][0] = 0; q.push(Node(dp[0][0],0,0)); while(!q.empty()){ Node u = q.top(); q.pop(); int id = u.id,w = u.w; if(vis[id][w]) continue; vis[id][w] = true; //printf("%f %d %d\n",dp[id][w],id,w); FOR(i,0,n){ if(i == id) continue; if(dp[i][w] > dp[id][w]+dist[i][id]-'0'){ dp[i][w] = dp[id][w]+dist[i][id]-'0'; //printf("%f %d %d\n",dp[i][w],i,w); q.push(Node(dp[i][w],i,w)); } if(w+1 <= k && dp[i][w+1] > dp[id][w]+(dist[i][id]-'0')/2.0){ dp[i][w+1] = dp[id][w]+(dist[i][id]-'0')/2.0; //printf("%f %d %d\n",dp[i][w+1],i,w+1); q.push(Node(dp[i][w+1],i,w+1)); } } //printf("\n\n"); } double ans = inf; FOR(i,0,k+1) ans = min(dp[1][i],ans); return ans; } }res;
相关文章推荐
- php生成随机字符串
- 使用PHP生成二维码的两种方法(带logo图像)
- PHP IMG2TXT 图片转成文字
- 详解 PHP加密解密字符串函数附源码下载
- PHP封装的字符串加密解密函数
- php之smarty学习一
- PHP学习建议(来自老手)
- 搭建ftp服务器
- ThinkPHP框架权限管理----权限分配的js实现
- WordPress升级错误:class-wp-filesystem-direct.php on line 122
- PHP封装的字符串加密解密函数
- 详解 PHP加密解密字符串函数附源码下载
- 解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
- WordPress中用于更新伪静态规则的PHP代码实例讲解
- thinkphp实现163、QQ邮箱收发邮件的方法
- 基于ThinkPHP实现批量删除
- PHP 简易图片验证码
- RTP协议校对翻译(二)
- JSON+Mysql+php实现
- EditPlus64的安装配置