bzoj2015 [Usaco2010 Feb]Chocolate Giving(最短路裸题)
2017-09-06 10:07
441 查看
把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 ,num=0,d ; bool f ; 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; 128ea 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 ,num=0,d ; bool vis ; 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; }
相关文章推荐
- BZOJ 2015: [Usaco2010 Feb]Chocolate Giving( 最短路 )
- bzoj 2015: [Usaco2010 Feb]Chocolate Giving
- bzoj2015 [Usaco2010 Feb]Chocolate Giving
- bzoj2015 [Usaco2010 Feb]Chocolate Giving
- BZOJ 2015: [Usaco2010 Feb]Chocolate Giving spfa
- bzoj 2015: [Usaco2010 Feb]Chocolate Giving【spfa】
- 【BZOJ】2015: [Usaco2010 Feb]Chocolate Giving(spfa)
- [BZOJ2015][Usaco2010 Feb]Chocolate Giving
- [BZOJ3942] [Usaco2015 Feb]Censoring
- BZOJ 1781 [Usaco2010 Feb]Ice 冰上
- BZOJ 3940 [Usaco2015 Feb] Censoring
- 【bzoj1782】[Usaco2010 Feb]slowdown 慢慢游 树链剖分+线段树
- 【Usaco2015 Feb】【BZOJ3943】SuperBull
- 【BZOJ3940】【Usaco2015 Feb】Censoring AC自动机
- 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈
- 【KMP】BZOJ3942-[Usaco2015 Feb] Censoring
- bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机
- BZOJ1782: [Usaco2010 Feb]slowdown 慢慢游
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
- 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树