题目链接:http://poj.org/problem?id=2449
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std; const int maxn = ;
const int maxe = ;
const int INF = 0x3f3f3f3f; struct Edge{
int v,w;
int next;
Edge(int v=,int w=,int next=):
v(v), w(w), next(next){}
};
struct Heap{
int u,f,g;
Heap(int u=,int f=,int g=): u(u), f(f), g(g){}
bool operator < (const Heap& rhs) const{
return f > rhs.f;
}
};
int dist[maxn]; struct Dijkstra{
Edge edges[maxe];
int head[maxn],cnt;
bool vis[maxn]; void init(){
memset(head,-,sizeof(head));
cnt = ;
} void addedge(int u,int v,int w){
edges[cnt] = Edge(v,w,head[u]);
head[u] = cnt++;
} void solve(int s){
memset(vis,,sizeof(vis));
memset(dist,0x3f,sizeof(dist));
priority_queue<Heap> Q;
Q.push(Heap(s,,));
dist[s] = ; while(!Q.empty()){
Heap temp = Q.top(); Q.pop();
int u = temp.u;
int d = temp.f;
if(vis[u]) continue;
vis[u] = true;
for(int i=head[u];i!=-;i=edges[i].next){
Edge& e = edges[i];
if(dist[e.v] > d + e.w){
dist[e.v] = d + e.w;
Q.push(Heap(e.v,dist[e.v],));
}
}
}
}
}solver1; struct A_Star{
Edge edges[maxe];
int head[maxn],cnt;
int num[maxn]; void init(){
memset(head,-,sizeof(head));
cnt = ;
} void addedge(int u,int v,int w){
edges[cnt] = Edge(v,w,head[u]);
head[u] = cnt++;
} int solve(int s,int t,int k){
memset(num,,sizeof(num));
priority_queue<Heap> Q;
if(dist[s] >= INF) return -;
Q.push(Heap(s,dist[s],)); while(!Q.empty()){
Heap temp = Q.top(); Q.pop();
int u = temp.u;
num[u]++;
if(num[t] == k){
return temp.f;
}
if(num[u] > k){
continue;
}
for(int i=head[u];i!=-;i=edges[i].next){
Edge& e = edges[i];
int g = temp.g + e.w;
int f = g + dist[e.v];
Q.push(Heap(e.v,f,g));
}
}
return -;
}
}solver2; int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
int N,M;
cin>>N>>M;
solver1.init();
solver2.init();
for(int i=;i<=M;i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
solver1.addedge(v,u,w);
solver2.addedge(u,v,w);
}
int s,t,k;
scanf("%d %d %d",&s,&t,&k);
solver1.solve(t);
if(s == t) k++;
int ans = solver2.solve(s,t,k);
printf("%d\n",ans);
}