您的位置:首页 > 其它

k短路

2015-08-13 23:32 337 查看
无聊整理一下

#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 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: