1 #include <stdio.h>
2 #include <string.h>
3 #include <queue>
4 #include <algorithm>
5 using namespace std;
6 const int L = 100005;
7 const int inf = 1<<30;
8 struct node
9 {
10 int now,g,f;
11 bool operator <(const node a)const
12 {
13 if(a.f == f) return a.g < g;
14 return a.f < f;
15 }
16 };
17 struct edges
18 {
19 int x,y,w,next;
20 } e[L<<2],re[L<<2];//e是输入给出的定向图,re为其逆向图,用于求t到其他所有点的最短路径
21
22 int head[1005],dis[1005],vis[1005],n,m,k,s,t,rehead[1005];
23
24 void Init()//初始化
25 {
26 memset(e,-1,sizeof(e));
27 memset(re,-1,sizeof(re));
28 for(int i = 0; i<=n; i++)
29 {
30 dis[i] = inf;
31 vis[i] = 0;
32 head[i] = -1;
33 rehead[i] = -1;
34 }
35 }
36
37 void AddEdges(int x,int y,int w,int k)
38 {
39 e[k].x = x,e[k].y = y,e[k].w = w,e[k].next = head[x],head[x] = k;
40 re[k].x = y,re[k].y = x,re[k].w = w,re[k].next = rehead[y],rehead[y] = k;
41 }
42
43 int relax(int u,int v,int c)
44 {
45 if(dis[v]>dis[u]+c)
46 {
47 dis[v] = dis[u]+c;
48 return 1;
49 }
50 return 0;
51 }
52
53 void SPFA(int src)
54 {
55 int i;
56 dis[src] = 0;
57 queue<int> Q;
58 Q.push(src);
59 while(!Q.empty())
60 {
61 int u,v;
62 u = Q.front();
63 Q.pop();
64 vis[u] = 0;
65 for(i = rehead[u]; i!=-1; i = re[i].next)
66 {
67 v = re[i].y;
68 if(relax(u,v,re[i].w) && !vis[v])
69 {
70 Q.push(v);
71 vis[v] = 1;
72 }
73 }
74 }
75 }
76
77 int Astar(int src,int to)
78 {
79 priority_queue<node> Q;
80 int i,cnt = 0;
81 if(src == to) k++;//在起点与终点是同一点的情况下,k要+1
82 if(dis[src] == inf) return -1;
83 node a,next;
84 a.now = src;
85 a.g = 0;
86 a.f = dis[src];
87 Q.push(a);
88 while(!Q.empty())
89 {
90 a = Q.top();
91 Q.pop();
92 if(a.now == to)
93 {
94 cnt++;
95 if(cnt == k)
96 return a.g;
97 }
98 for(i = head[a.now]; i!=-1; i = e[i].next)
99 {
100 next = a;
101 next.now = e[i].y;
102 next.g = a.g+e[i].w;
103 next.f = next.g+dis[next.now];
104 Q.push(next);
105
106 }
107 }
108 return -1;
109 }
110
111 int main()
112 {
113 int i,j,x,y,w;
114 while(~scanf("%d%d",&n,&m))
115 {
116 Init();
117 for(i = 0; i<m; i++)
118 {
119 scanf("%d%d%d",&x,&y,&w);
120 AddEdges(x,y,w,i);
121 }
122 scanf("%d%d%d",&s,&t,&k);
123 SPFA(t);
124 printf("%d\n",Astar(s,t));
125 }
126
127 return 0;
128 }