bzoj2100 [Usaco2010 Dec]Apple Delivery(slf优化的spfa)
来源:互联网 发布:什么是源码销售 编辑:程序博客网 时间:2024/06/04 00:46
朴素spfa过不去啊啊啊。。。所谓slf优化,就是small label first策略,设要加入的节点是j,队首元素为i,若dist(j) < dist(i),则将j插入队首,否则插入队尾。 我们用双端队列deque来实现就好了。
还有一种更高效的LLL优化:Large Label Last 策略,设队首元素为i,队列中所有dist值的平均值为x,若dist(i)>x则将i插入到队尾,查找下一元素,直到找到某一i使得dist(i)<=x,则将i出对进行松弛操作。
slf优化
#include <bits/stdc++.h>using namespace std;#define N 100010#define M 200010#define inf 0x3f3f3f3f#define ll long longinline 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,s,t1,t2,d[N],h[N],num=0;bool inq[N];struct edge{ int to,next,val;}data[M<<1];inline void add1(int x,int y,int val){ data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;}void spfa(int ss){ deque<int>q;memset(d,0x3f,sizeof(d)); q.push_back(ss);d[ss]=0;inq[ss]=1; while(!q.empty()){ int x=q.front();q.pop_front();inq[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(!inq[y]){ inq[y]=1; if(!q.empty()&&d[y]<d[q.front()]) q.push_front(y); else q.push_back(y); } } } }}int main(){// freopen("a.in","r",stdin); m=read();n=read();s=read();t1=read();t2=read(); while(m--){ int x=read(),y=read(),val=read();add1(x,y,val);add1(y,x,val); } spfa(t1); int ans=d[s]+d[t2]; spfa(t2); printf("%d\n",min(ans,d[s]+d[t1])); return 0;}
lll优化+slf优化
#include <bits/stdc++.h>using namespace std;#define N 100010#define M 200010#define inf 0x3f3f3f3f#define ll long longinline 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,s,t1,t2,d[N],h[N],num=0;bool inq[N];struct edge{ int to,next,val;}data[M<<1];inline void add1(int x,int y,int val){ data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;}void spfa(int ss){ deque<int>q;memset(d,0x3f,sizeof(d)); q.push_back(ss);d[ss]=0;inq[ss]=1;int tot=1,sum=0; while(!q.empty()){ int x=q.front();q.pop_front(); if(d[x]*tot>sum){q.push_back(x);continue;}//lll优化 tot--;sum-=d[x];inq[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(!inq[y]){ inq[y]=1;tot++;sum+=d[y];//slf优化 if(!q.empty()&&d[y]<d[q.front()]) q.push_front(y); else q.push_back(y); } } } }}int main(){// freopen("a.in","r",stdin); m=read();n=read();s=read();t1=read();t2=read(); while(m--){ int x=read(),y=read(),val=read();add1(x,y,val);add1(y,x,val); } spfa(t1); int ans=d[s]+d[t2]; spfa(t2); printf("%d\n",min(ans,d[s]+d[t1])); return 0;}
阅读全文
0 0
- bzoj2100 [Usaco2010 Dec]Apple Delivery(slf优化的spfa)
- BZOJ2100: [Usaco2010 Dec]Apple Delivery Spfa+优化
- bzoj2100 [Usaco2010 Dec]Apple Delivery
- 【bzoj2100】[Usaco2010 Dec]Apple Delivery 最短路
- BZOJ 2100 [Usaco2010 Dec]Apple Delivery 最短路
- spfa 的 slf 优化
- SPFA的SLF与LLL优化
- spfa的SLF 和 LLL优化算法
- 单源最短路----Spfa模板 (SLF优化)
- spfa优化 SLF LLL
- SPFA模板(SLF优化)
- [图论] SPFA + SLF优化
- SPFA,SLF优化
- spfa SLF优化
- spfa的2种优化——洛谷P3003 [USACO10DEC]苹果交货Apple Delivery
- 2017.7.3 SPFA SLF优化
- [SPFA的SLF优化] Codeforces Round #257 (Div. 1) B
- 算法提高 道路和航路 (SPFA的SLF优化)
- 欢迎使用CSDN-markdown编辑器
- ==和equal的区别
- Android线程操作类(暂停、重新开启、停止)
- spring通过@Configuration @Bean注入Bean
- 又是新的挑战
- bzoj2100 [Usaco2010 Dec]Apple Delivery(slf优化的spfa)
- Java中CAS详解(转)
- 数据分析的统计方法选择小结(变量之间的关联性分析)
- Python学习笔记-17.09.13
- BAPC 2016 The 2016 Benelux Algorithm Programming Contest------I: Older Brother
- php计算两个日期相差天数的方法
- bzoj 1047(单调队列)
- 养儿防老?
- 百度地图relase版本地图图层显示不出来