k短路
2015-08-13 23:32
337 查看
无聊整理一下
View Code
所以他想找出K条不同的路径并使得这K条路为最短的K条路径。
第2..M+1行:每一行包含三个数x,y,d,表示有一条从x到y的路,路径长度为d,保证x>y
注意只输出一行-1。比如样例中没有第7和第8短路我们只输出一行-1 。
5 4 1
5 3 1
5 2 1
5 1 1
4 3 4
3 1 1
3 2 1
2 1 1
2
2
3
6
7
-1
对于100%的数据:0<=n<=1000,0<=m<=10000,0<=k<=100
#include<bits/stdc++.h> #define clr(a,x) memset(a,x,sizeof(a)) #define rep(i,l,r) for(int i=l;i<r;i++) typedef long long ll; using namespace std; int read() { char c=getchar(); int ans=0,f=1; while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ ans=ans*10+c-'0'; c=getchar(); } return ans*f; } struct edge{ int d,to; }; struct node{ int num,d; inline bool operator <(const node&A)const{ return d>A.d; } }; const int maxn=1009,inf=0x3fffffff; int n,m,k,d[maxn]; priority_queue<node>Q; vector<edge>e[maxn]; vector<edge>e1[maxn]; void dijkstra() { rep(i,i,n+1) d[i]=inf; d[1]=0; node start; start.num=1,start.d=0; Q.push(start); while(!Q.empty()){ node now=Q.top(); Q.pop(); if(now.d==d[now.num]){ rep(i,0,e1[now.num].size()){ if(d[now.num]+e1[now.num][i].d<d[e1[now.num][i].to]){ d[e1[now.num][i].to]=d[now.num]+e1[now.num][i].d; node next; next.num=e1[now.num][i].to; next.d=d[e1[now.num][i].to]; Q.push(next); } } } } } void work() { int cnt=0; while(!Q.empty()) Q.pop(); node start; start.num=n,start.d=d ; Q.push(start); while(cnt<k&&!Q.empty()){ node now=Q.top(); Q.pop(); if(now.num==1){ ++cnt; printf("%d\n",now.d); }else{ rep(i,0,e[now.num].size()){ node next; next.num=e[now.num][i].to; next.d=now.d-d[now.num]+e[now.num][i].d+d[e[now.num][i].to]; Q.push(next); } } } if(cnt<k) printf("-1\n"); } int main() { n=read(),m=read(),k=read(); rep(i,0,m){ edge ed; int from=read(); ed.to=read(),ed.d=read(); e[from].push_back(ed); swap(ed.to,from); e1[from].push_back(ed); } dijkstra(); work(); return 0; }
View Code
跑步 【STSR】Round #3
描述
有一个人,他在一座山上,他准备用从顶峰跑到山脚的方法来锻炼,而且只沿着下坡的路跑到山脚。山一共有M条路,每条路连接两个用1..N标号的地点,如果X>Y,则地点X大于地点Y的高度。但是因为他比较懒,所以他想跑最短的路径。但是很快他厌倦了一直走同一条路,所以他想找出K条不同的路径并使得这K条路为最短的K条路径。
输入格式
第1行:三个数:N,M,K第2..M+1行:每一行包含三个数x,y,d,表示有一条从x到y的路,路径长度为d,保证x>y
输出格式
第1..K行:第i行包含第i短路的长度(如果存在的话)。如果不存在第i短路的长度则输出-1注意只输出一行-1。比如样例中没有第7和第8短路我们只输出一行-1 。
样例输入
5 8 85 4 1
5 3 1
5 2 1
5 1 1
4 3 4
3 1 1
3 2 1
2 1 1
样例输出
12
2
3
6
7
-1
数据范围与约定
对于30%的数据:0<=n<=100,0<=m<=10000,0<=k<=100对于100%的数据:0<=n<=1000,0<=m<=10000,0<=k<=100
相关文章推荐
- 问题:交叉编译
- Javascript - StringBuilder
- BroadcastReceiver的简单使用
- 实现jQuery扩展总结
- 2015-08-13NOIP模拟赛
- iOS UIPopoverView的使用
- Fragment的知识总结
- Redis对于key的操作命令
- java netty socket库和自定义C#socket库利用protobuf进行通信完整实例
- TCP/IP详解学习笔记
- Linq的join后面跟多个条件
- 如何利用OpenCV自带的haar training程序训练分类器
- HDU 5387 Clock // 模拟
- 如何在一家大公司里受到重用
- 递归全排列
- 全网最全ASP.NET MVC 教程汇总
- java 中的异步回调
- 人民币阿拉伯数字转中文大写
- html学习笔记(15)
- 黑马程序员———正则表达式及其其他类