bzoj2015 [Usaco2010 Feb]Chocolate Giving(最短路裸题)

来源:互联网 发布:java bigdecimal 赋值 编辑:程序博客网 时间:2024/03/29 18:05

把1当作源点,答案就是d[x]+d[y]。试了一下两种写法。

spfa版,复杂度O(m)

124ms

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#define N 50010#define M 100010#define inf 0x3f3f3f3finline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,tt,h[N],num=0,d[N];bool f[N];struct edge{    int to,next,val;}data[M<<1];void spfa(){    std::queue<int>q;    memset(d,0x3f,sizeof(d));    q.push(1);f[1]=1;d[1]=0;    while(!q.empty()){        int x=q.front();q.pop();f[x]=0;        for(int i=h[x];i;i=data[i].next){            int y=data[i].to;            if(d[x]+data[i].val<d[y]){                d[y]=d[x]+data[i].val;                if(!f[y]) f[y]=1,q.push(y);            }        }    }}int main(){//  freopen("a.in","r",stdin);    n=read();m=read();tt=read();    while(m--){        int x=read(),y=read(),val=read();        data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;        data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val;    }    spfa();    while(tt--){        int x=read(),y=read();        printf("%d\n",d[x]+d[y]);    }    return 0;}

Dijkstra+STL版,复杂度O(nlogn)

144ms

#include <bits/stdc++.h>using namespace std;#define N 50010#define M 100010#define inf 0x3f3f3f3f#define pa pair<int,int>inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,tt,h[N],num=0,d[N];bool vis[N];struct edge{    int to,next,val;}data[M<<1];void Dijkstra(){    memset(d,0x3f,sizeof(d));    std::priority_queue<pa,vector<pa>,greater<pa> >q;//按first小根堆     q.push(make_pair(0,1));d[1]=0;    while(!q.empty()){        int x=q.top().second;q.pop();        if(vis[x]) continue;vis[x]=1;        for(int i=h[x];i;i=data[i].next){            int y=data[i].to;            if(d[x]+data[i].val<d[y]){                d[y]=d[x]+data[i].val;                q.push(make_pair(d[y],y));            }        }    }}int main(){//  freopen("a.in","r",stdin);    n=read();m=read();tt=read();    while(m--){        int x=read(),y=read(),val=read();        data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;        data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val;    }    Dijkstra();    while(tt--){        int x=read(),y=read();        printf("%d\n",d[x]+d[y]);    }    return 0;}