1 #include<stdio.h> 2 #include<string.h> 3 const int INF = 1 << 30; 4 const int N = 5000; 5 const int M = 300000; 6 int n, m; 7 struct Edge { 8 int u, v, w, next; 9 Edge() {} 10 Edge(int u, int v, int w, int next) : u(u), v(v), w(w), next(next) {} 11 }E[M]; 12 int head[N], tot; 13 void addEdge(int u, int v, int w) { 14 E[tot] = Edge(u, v, w, head[u]); 15 head[u] = tot++; 16 } 17 void init() { 18 memset(head, -1, sizeof(head)); 19 tot = 0; 20 } 21 bool inq[N][600];//是否在队列中 22 int d[N][600];//s到各个源点的距离 23 struct queue { 24 int num, u; 25 queue() {} 26 queue(int num, int u) : num(num), u(u) {} 27 }Q[M]; 28 int spfa(int src, int t, int k) { 29 int front = 0, rear = -1; 30 for(int i = 0; i < n; ++i) { 31 for(int j = 0; j <= k; ++j) 32 d[i][j] = INF, inq[i][j] = 0; 33 } 34 Q[++rear] = queue(0, src), inq[src][0] = true; d[src][0] = 0; 35 while(front <= rear) { 36 queue cur = Q[front++]; 37 inq[cur.u][cur.num] = false; 38 for(int i = head[cur.u]; i != -1; i = E[i].next) { 39 Edge e = E[i]; 40 queue next; 41 next.num = cur.num + 10, next.u = e.v; 42 if(next.num > k) next.num = k; 43 if(d[e.v][next.num] > d[cur.u][cur.num] + e.w) { 44 d[e.v][next.num] = d[cur.u][cur.num] + e.w; 45 if(!inq[e.v][next.num]) { 46 Q[++rear] = next; inq[e.v][next.num] = true; 47 } 48 } 49 } 50 } 51 if(d[t][k] == INF) return -1; 52 else return d[t][k]; 53 } 54 int main() { 55 while(scanf("%d%d", &n, &m) != EOF) { 56 init(); 57 while(m--) { 58 int u, v, w; 59 scanf("%d%d%d", &u, &v, &w); 60 u--, v--; 61 addEdge(u, v, w), addEdge(v, u, w); 62 } 63 int s, t, k; 64 scanf("%d%d%d", &s, &t, &k); 65 s--, t--; 66 int ans = spfa(s, t, k); 67 if(ans == -1) printf("-1\n"); 68 else printf("%d\n", ans); 69 } 70 return 0; 71 }
浙公网安备 33010602011771号