#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<vector> #include<map> #include<unordered_map> #include<stack> #include<queue> #include<iostream> usingnamespace std; typedeflonglong ll; typedeflonglong ld; constint MAXN = 1e3 + 5; int n, m, k, tot, H[MAXN], dis[MAXN][MAXN]; structEdge { int from, to, nextNbr, w; }E[MAXN << 1]; voidaddEdge(int u, int v, int w){ tot++; E[tot].from = u; E[tot].to = v; E[tot].nextNbr = H[u]; E[tot].w = w; H[u] = tot; } typedefstructqnode { //存放在优先队列中 int u, dis; booloperator <(conststruct qnode& oth) const { return dis > oth.dis; } } qnode; structRoute { //记录每个快递员的路径起点与终点 int st, ed; }Route[MAXN]; voiddijstra(int st){ //求出以st为起点,到达其他点的最短路径 for (int i = 1; i <= n; i++) dis[st][i] = 0x3f3f3f3f; dis[st][st] = 0; priority_queue<qnode> myque; myque.push({ st, 0 }); while (!myque.empty()) { int u = myque.top().u, curdis = myque.top().dis; myque.pop(); if (curdis != dis[st][u]) continue; for (int i = H[u]; i >= 0; i = E[i].nextNbr) { int v = E[i].to, w = E[i].w; if (u == v) continue; if (dis[st][u] + w < dis[st][v]) { dis[st][v] = dis[st][u] + w; myque.push({ v, dis[st][v] }); } } } } intmain(){ scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) H[i] = -1; for (int i = 1, u, v, w; i <= m; i++) { scanf("%d%d%d", &u, &v, &w); addEdge(u, v, w); addEdge(v, u, w); } int ans = 0x3f3f3f3f; for (int i = 1; i <= n; i++) dijstra(i); for (int i = 1; i <= k; i++) scanf("%d%d", &Route[i].st, &Route[i].ed); for (int i = 1; i <= tot; i+=2) { //【先】枚举需要去除的边,因为只能去除一条边 int u = E[i].from, v = E[i].to; int sum = 0; for (int j = 1; j <= k; j++) { //【后】枚举去掉该边后,更新每个快递员的最短路径 int st = Route[j].st, ed = Route[j].ed; sum += min(dis[st][ed], min(dis[st][u] + dis[v][ed], dis[st][v] + dis[u][ed])); } //注意!!!一定要从两个方向取最小值 ans = min(ans, sum); } printf("%d\n", ans); return0; }