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

xiaoxiao2021-02-28  24

把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 0x3f3f3f3f 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 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; }
转载请注明原文地址: https://www.6miu.com/read-250192.html

最新回复(0)