![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,k; 4 const int maxn=1e6+10; 5 const int maxm=9e6+10; 6 const int inf=0x3f3f3f3f; 7 struct Dijkstra 8 { 9 struct Edge 10 { 11 int next, to ,w; 12 } e[maxm]; 13 int head[maxn],v[maxn],d[maxn],tol; 14 void add(int u, int v, int w) 15 { 16 tol++; 17 e[tol].to = v; 18 e[tol].next = head[u]; 19 e[tol].w = w; 20 head[u] = tol; 21 } 22 priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1; 23 int dijkstra(int s,int t) 24 { 25 memset(d,inf,sizeof(d)); 26 memset(v,0,sizeof(v)); 27 d[s] = 0; 28 q1.push(make_pair(0, s)); 29 while (!q1.empty()) 30 { 31 int x = q1.top().second; 32 q1.pop(); 33 if (!v[x]) 34 { 35 v[x] = 1; 36 for (register int i = head[x]; i; i = e[i].next) 37 { 38 int to=e[i].to,k=max(e[i].w,d[x]); 39 if (d[to]>k){ 40 d[to]=k; 41 q1.push(make_pair(d[to], to)); 42 } 43 } 44 } 45 } 46 return d[t]; 47 } 48 49 void init() 50 { 51 memset(head, 0, sizeof(head)); 52 tol = 0; 53 } 54 } H; 55 56 57 int main(){ 58 scanf("%d%d%d",&n,&m,&k); 59 H.init(); 60 for (int i=1;i<=m;i++){ 61 int u,v,w; 62 scanf("%d%d%d",&u,&v,&w); 63 H.add(u,v,w); 64 H.add(v,u,w); 65 for (int j=1;j<=k;j++) { 66 H.add(u+n*(j-1), v + j * n, 0); 67 H.add(v+n*(j-1), u+ j * n, 0); 68 H.add(u+j*n,v+j*n,w); 69 H.add(v+j*n,u+j*n,w); 70 } 71 for (int i=1;i<=k;i++){ 72 H.add(i*n,(i+1)*n,0); 73 } 74 } 75 int ans=H.dijkstra(1,n*(k+1)); 76 if (ans==inf) printf("-1\n");else printf("%d\n",ans); 77 }