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
| #include <bits/stdc++.h> #define ll long long #define int long long #define maxn 1020 #define rep(i, a, b) for(int i = (a); i <= (b); i ++) #define love return #define you 0 #define inf 0x3f3f3f3f #define me 1
using namespace std;
int dist[maxn]; int n,m,k; int cosent[maxn][maxn]; int ans[maxn][maxn];
int to[maxn]; bool f[maxn];
signed main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout);
cin >> n >> m >> k;
memset(cosent, inf, sizeof(cosent)); memset(ans,0, sizeof(ans));
rep(i, 0, n) { to[i] = i; dist[i] = inf; cosent[i][i] = 0; } rep(i, 1, m) { int u, v, w; cin >> u >> v >> w;
if(cosent[u][v] > w) { cosent[u][v] = cosent[v][u] = w; } } dist[1] = 0; rep(i, 1, n) { int mx = inf; int v = -1;
rep(j, 1, n) { if(!f[j] && dist[j] < mx) { v = j; mx = dist[j]; } }
if(v==-1) break;
rep(j, 1, n) { if(f[j]) { ans[v][j] = ans[j][v] = max(ans[to[v]][j], mx); } } f[v] = 1;
rep(j, 1, n) { if(!f[j] && cosent[v][j] < dist[j]) { dist[j] = cosent[v][j]; to[j] = v; } } }
rep(i, 1, k) { int u, v; cin >> u >> v; cout << (ans[u][v] == 0 ? -1 : ans[u][v]) << endl; } love you; }
|