k短路

无聊整理一下

 1 #include<bits/stdc++.h>
 2 #define clr(a,x) memset(a,x,sizeof(a))
 3 #define rep(i,l,r) for(int i=l;i<r;i++)
 4 typedef long long ll;
 5 using namespace std;
 6 int read()
 7 {
 8     char c=getchar();
 9     int ans=0,f=1;
10     while(!isdigit(c)){
11         if(c=='-') f=-1;
12         c=getchar();
13     }
14     while(isdigit(c)){
15         ans=ans*10+c-'0';
16         c=getchar();
17     }
18     return ans*f;
19 }
20 struct edge{
21     int d,to;
22 };
23 struct node{
24     int num,d;
25     inline bool operator <(const node&A)const{
26         return d>A.d;
27     } 
28 };
29 const int maxn=1009,inf=0x3fffffff;
30 int n,m,k,d[maxn];
31 priority_queue<node>Q;
32 vector<edge>e[maxn];
33 vector<edge>e1[maxn];
34 void dijkstra()
35 {
36     rep(i,i,n+1) d[i]=inf;
37     d[1]=0;
38     node start;
39     start.num=1,start.d=0;
40     Q.push(start);
41     while(!Q.empty()){
42         node now=Q.top();
43         Q.pop();
44         if(now.d==d[now.num]){
45             rep(i,0,e1[now.num].size()){
46                 if(d[now.num]+e1[now.num][i].d<d[e1[now.num][i].to]){
47                     d[e1[now.num][i].to]=d[now.num]+e1[now.num][i].d;
48                     node next;
49                     next.num=e1[now.num][i].to;
50                     next.d=d[e1[now.num][i].to];
51                     Q.push(next);
52                 }
53             }
54         }
55     }
56 }
57 void work()
58 {    
59     int cnt=0;
60     while(!Q.empty()) Q.pop();
61     node start;
62     start.num=n,start.d=d[n];
63     Q.push(start);
64     while(cnt<k&&!Q.empty()){
65         node now=Q.top();
66         Q.pop();
67         if(now.num==1){
68             ++cnt;
69             printf("%d\n",now.d);
70         }else{
71             rep(i,0,e[now.num].size()){
72                 node next;
73                 next.num=e[now.num][i].to;
74                 next.d=now.d-d[now.num]+e[now.num][i].d+d[e[now.num][i].to];
75                 Q.push(next);
76             }
77         }
78     }
79     if(cnt<k) printf("-1\n");
80 }
81 int main()
82 {    
83     n=read(),m=read(),k=read();
84     rep(i,0,m){
85         edge ed;
86         int from=read();
87         ed.to=read(),ed.d=read();
88         e[from].push_back(ed);
89         swap(ed.to,from);
90         e1[from].push_back(ed);
91     }
92     dijkstra();
93     work();
94     return 0;
95 }
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 8

5 4 1

5 3 1

5 2 1

5 1 1

4 3 4

3 1 1

3 2 1

2 1 1

样例输出

1

2

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
posted @ 2015-08-13 23:32  ChenThree  阅读(316)  评论(0编辑  收藏  举报