
1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 #include <stdio.h> 5 using namespace std; 6 int m,n,s,t,k; 7 #define M 100005 8 #define N 1005 9 #define INF 100000000 10 int dis[N]; 11 struct edge 12 { 13 int v,val,next;//边的终点,边权 14 edge(){} 15 edge(int _v,int _val,int _next){v=_v,val=_val,next=_next;} 16 }line[M],_line[M]; 17 int head[M],_head[M]; 18 19 struct dijnode 20 { 21 int v,dis; 22 dijnode(){} 23 dijnode(int _v,int _dis){v=_v,dis=_dis;} 24 friend bool operator <(const dijnode &a,const dijnode &b) 25 { 26 return a.dis>b.dis; 27 } 28 }; 29 struct Anode 30 { 31 int v,g,h;//v:当前点 g:起点到点v距离 h:点v到终点距离 32 Anode(){} 33 Anode(int _v,int _g,int _h){v=_v,g=_g;h=_h;} 34 friend bool operator <(const Anode&a,const Anode&b) 35 { 36 return a.h+a.g>b.h+b.g; 37 } 38 }; 39 void input(){ 40 memset(head,-1,sizeof(head)); 41 memset(_head,-1,sizeof(_head)); 42 int u,v,val; 43 int e=0,_e=0; 44 for(int i=0;i<m;i++) 45 { 46 scanf("%d%d%d",&u,&v,&val); 47 line[e]=edge(v,val,head[u]); 48 head[u]=e++; 49 _line[_e]=edge(u,val,head[v]); 50 _head[v]=_e++; 51 } 52 } 53 int vis[N]; 54 void dijkstra() 55 { 56 memset(vis,0,sizeof(vis)); 57 priority_queue<dijnode>pq; 58 for(int i=0;i<n;i++) 59 dis[i]=INF; 60 61 dijnode node =dijnode(t,0); 62 dis[t]=0; 63 pq.push(node); 64 65 while(!pq.empty()) 66 { 67 dijnode tmp = pq.top(); 68 pq.pop(); 69 70 if(vis[tmp.v])continue; 71 vis[tmp.v]=1; 72 for(int i=_head[tmp.v];i!=-1;i=_line[i].next) 73 { 74 if(tmp.dis+_line[i].val<dis[_line[i].v]) 75 { 76 dis[_line[i].v]=tmp.dis+_line[i].val; 77 pq.push(dijnode(_line[i].v,dis[_line[i].v])); 78 } 79 } 80 } 81 for(int i=1;i<=n;i++)printf("%d ",dis[i]); 82 83 } 84 int kcnt[N]; 85 int Astar() 86 { 87 if(dis[s]>=INF)return -1; 88 memset(kcnt,0,sizeof(kcnt)); 89 priority_queue<Anode> pq; 90 pq.push(Anode(s,0,dis[s])); 91 Anode node; 92 while(!pq.empty()) 93 { 94 node = pq.top(); 95 pq.pop(); 96 if(kcnt[node.v]>=k)continue; 97 98 kcnt[node.v]++; 99 if(kcnt[t]>=k)return node.g; 100 for(int i=head[node.v];i!=-1;i = line[i].next) 101 { 102 pq.push(Anode(line[i].v,node.g+line[i].val,dis[line[i].v])); 103 } 104 } 105 return -1; 106 107 } 108 int main(int argc, const char * argv[]) 109 { 110 111 while(scanf("%d%d",&n,&m)!=EOF) 112 { 113 input(); 114 scanf("%d%d%d",&s,&t,&k); 115 dijkstra(); 116 printf("%d ",Astar()); 117 } 118 }