1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include<bits/stdc++.h> #define INF 0x3f3f3f3f #define pi 3.1415926 #define mp(x, y) make_pair(x, y) #define vi vector<int> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> Pair; const int MAX = 1e3 + 10; struct edge { int nxt, to, w; }e[MAX * 2]; int head[MAX], tot; void add(int u, int v, int w) { e[++tot].nxt = head[u]; e[tot].to = v; e[tot].w = w; head[u] = tot; } int N, M, S, T, K; int f[MAX][MAX], vis[MAX]; int grap[MAX][MAX]; void Dijkstra0(int u) { for(int i=1; i<=N; i++) { vis[i]=0; } vis[u] = 1; f[u][0] = 0; int k=0; for(int i=1; i<N; i++) { for(int it=head[u]; it; it=e[it].nxt) { if(vis[e[it].to]) continue; f[e[it].to][k] = min(f[e[it].to][k], f[u][k]+e[it].w); } int mm = INF, mp=u; for(int i=1; i<=N; i++) { if(!vis[i] && mm>f[i][k]) { mm=f[i][k]; mp = i; } } u = mp; vis[u] = 1; } } inline void Dijkstra(int k) { for(int i=1; i<=N; i++) { for(int it=head[i]; it; it=e[it].nxt) { f[e[it].to][k] = min(f[e[it].to][k], f[i][k-1]); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); tot = 0; cin >> N >> M >> S >> T >> K; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { grap[i][j] = INF; } } for(int i=0; i<=K; i++) { for(int j=1; j<=N; j++) { f[j][i]=INF; } } for (int i = 1; i <= M; i++) { int u, v, w; cin >> u >> v >> w; grap[v][u] = grap[u][v] = min(grap[u][v], w); } for (int i = 1; i <= N; i++) { for (int j = i + 1; j <= N; j++) { if (grap[i][j] < INF) { add(i, j, grap[i][j]); add(j, i, grap[i][j]); } } } Dijkstra0(S); for(int i=1; i<=K; i++) { Dijkstra(i); } cout << f[T][K] << endl; return 0; }
|