http://www.lydsy.com/JudgeOnline/problem.php?id=2015
裸最短路(' ' ) 不过我最初以为是mst (' ' )
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 100010;
const int maxe = 100010;
const int INF = 0x3f3f3f3f;
int n, m, Q;
struct edge {
int t, d;
edge* next;
}e[maxe * 2], *head[maxn]; int ne = 0;
void addedge(int f, int t, int d) {
e[ne].t = t, e[ne].d = d, e[ne].next = head[f], head[f] = e + ne ++;
}
struct pr {
int dis, pos;
pr(int a, int b) {
dis = a, pos = b;
}
};
bool operator < (const pr &a, const pr &b) {
return a.dis > b.dis;
}
priority_queue <pr> q;
int dis[maxn];
void dijkstra(int s) {
memset(dis, INF, sizeof(dis));
dis[s] = 0;
for(int i = 1; i <= n; ++ i) q.push(pr(dis[i], i));
while(!q.empty()) {
pr x = q.top(); q.pop();
if(x.dis != dis[x.pos]) continue;
for(edge* p = head[x. pos]; p; p = p-> next) {
if(dis[p-> t] > dis[x. pos] + p-> d)
dis[p-> t] = dis[x. pos] + p-> d, q.push(pr(dis[p-> t], p-> t));
}
}
}
int int_get() {
int x = 0; char c = (char)getchar(); bool f = 0;
while(!isdigit(c)) {
if(c == '-') f = 1;
c = (char)getchar();
}
while(isdigit(c)) {
x = x * 10 + (int)(c - '0');
c = (char)getchar();
}
if(f) x = -x;
return x;
}
void read() {
n = int_get(), m = int_get(); Q = int_get();
for(int i = 1; i <= m; ++ i) {
int u, v, w;
u = int_get(), v = int_get(), w = int_get();
addedge(u, v, w); addedge(v, u, w);
}
}
void sov() {
dijkstra(1) ;
while(Q --) {
int a, b;
a = int_get(), b = int_get();
printf("%d\n", dis[a] + dis[b]);
}
}
int main() {
//freopen("test.in", "r", stdin);
read(), sov();
return 0;
}