http://www.lydsy.com/JudgeOnline/problem.php?id=1598
原来k短路这么容易理解
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u,head) for(int i=head[u];~i;i=e[i].next)
#define LL long long
#define MP make_pair
typedef pair<int,int> pii;
typedef __gnu_pbds::priority_queue<pii,greater<pii>,pairing_heap_tag> heap;
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
const int inf=0x3f3f3f3f;
const int N=10010,M=10010;
int n,m,k;
struct edge{int v,w,next;}e[M*2];
int head[2][N],kk;
int dis[N];
heap q;
heap::point_iterator id[N];
int ans[N];
int tm[N];
void adde(int u,int v,int w,int *head){e[kk]=(edge){v,w,head[u]};head[u]=kk++;}
void dijkstra()
{
MS(dis,inf);
dis[1]=0;
id[1]=q.push(MP(0,1));
while(!q.empty())
{
int u=q.top().second; q.pop();
INE(i,u,head[1])
{
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w)
{
dis[v]=dis[u]+e[i].w;
if(id[v]!=0) q.modify(id[v],MP(dis[v],v));
else id[v]=q.push(MP(dis[v],v));
}
}
}
}
void Astar()
{
if(dis[n]==inf) return;
q.push(MP(dis[n],n));
while(!q.empty())
{
int u=q.top().second,d=q.top().first; q.pop();
tm[u]++;
if(u==1) ans[tm[u]]=d;
if(tm[u]<=k)
{
INE(i,u,head[0])
{
int v=e[i].v;
q.push(MP(d-dis[u]+dis[v]+e[i].w,v));
}
}
}
}
void input()
{
MS(head,-1);
n=read(); m=read(); k=read();
rep(i,1,m)
{
int u=read(),v=read(),w=read();
adde(u,v,w,head[0]);
adde(v,u,w,head[1]);
}
}
void solve()
{
dijkstra();
MS(ans,-1);
Astar();
rep(i,1,k) printf("%d\n",ans[i]);
}
int main()
{
//freopen("_.in","r",stdin); freopen("_.out","w",stdout);
input(),solve();
return 0;
}