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;
}