hdu - 2851 Lode Runner (最短路)
2015-06-03 15:53
288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2851
首先有n层,每层的路径都有一个起点和终点和对应的危险值,如果某两层之间有交集,就能从这一层上到另外一层,不过只能上不能下.
给定m个目标点求出到目标点的最小危险值.
因为权值不一样,所以不能用bfs,dijkstra就好。
建图 就是把所有相连的边处理出来,因为读入是对y排序的.然后以此dijkstra就能求出所有点的最小花费。
首先有n层,每层的路径都有一个起点和终点和对应的危险值,如果某两层之间有交集,就能从这一层上到另外一层,不过只能上不能下.
给定m个目标点求出到目标点的最小危险值.
因为权值不一样,所以不能用bfs,dijkstra就好。
建图 就是把所有相连的边处理出来,因为读入是对y排序的.然后以此dijkstra就能求出所有点的最小花费。
#include <cstdio> #include <cstring> #include <vector> #include <queue> using namespace std; const int maxn = 2010; const int INF = 1<<30; int n,m; struct node { int x,y,cost; }f[maxn]; struct edge { int to,cost; edge(){} edge(int x,int y) { to=x; cost=y; } }; typedef pair<int,int>P; vector<edge>G[maxn]; int d[maxn]; void dijkstra(int s) { priority_queue<P,vector<P>,greater<P> >que; for(int i=1;i<=maxn;i++) d[i]=INF; d[s]=f[1].cost; que.push(P(f[1].cost,s)); while(!que.empty()) { P p=que.top();que.pop(); int v=p.second; if(d[v]<p.first) continue; for(int i=0;i<G[v].size();i++) { edge e=G[v][i]; if(d[e.to]>d[v]+e.cost) { d[e.to]=d[v]+e.cost; que.push(P(d[e.to],e.to)); } } } } int main() { //freopen("a.txt","r",stdin); int t,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { G[i].clear(); scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].cost); } //printf("%d\n",n); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) if(f[j].x<=f[i].y) { G[i].push_back(edge(j,f[j].cost)); // printf("%d %d %d\n",i,j,p[i].cost+p[j].cost); } } dijkstra(1); for(int i=0;i<m;i++) { scanf("%d",&k); if(d[k]==INF) printf("-1\n"); else printf("%d\n",d[k]); } } return 0; }
相关文章推荐
- iOS:判断昨天,今天,今年
- Linux VNCserver的配置
- inline内联函数
- FMDB同时支持ARC&MRC 代码
- 第十三周 项目一 动物这样叫(2)
- mysql 数据文件位置修改
- sqlserver 随机查询
- SLC MLC 和TLC
- 活动时间判断
- C++ 之STL priority_queue
- document.execCommand()的用法小记
- Eclipse Designer根据Activiti项目打包发布bar文件
- 使用bake安装dce quagga
- 【套题】Codeforces#304(div2)
- spring security之httpSecurity使用示例
- 如何让控制台不显示出来
- 并查集小结
- 几个复制表结构和表数据的方法
- boost的原子操作
- cocoapods安装前奏篇