首页 > 代码库 > bzoj 2015

bzoj 2015

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

 

bzoj 2015