spfa与SLF和LLL(复习)

Posted hcl6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spfa与SLF和LLL(复习)相关的知识,希望对你有一定的参考价值。

技术图片
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int mac=4e5+50;
  4 int head[mac],vis[mac],dis[mac];
  5 int n,m,num,i,j,t;
  6 struct edge{
  7     int v,w,next;
  8 }a[mac]; 
  9 void sc(){
 10     int x,y,z;
 11     scanf("%d %d",&n,&m);
 12     for(i=1;i<=m;i++){
 13         scanf("%d %d %d",&x,&y,&z);
 14         a[++num]=(edge){y,z,head[x]};
 15         head[x]=num;
 16         a[++num]=(edge){x,z,head[y]};//无向图 双向边,然后数组两倍边数 
 17         head[y]=num;
 18     }
 19 }
 20 void spfa(){
 21     memset(dis,0x3f, sizeof(dis));
 22     deque<int>q;
 23     q.push_back(1); 
 24     vis[1]=1; 
 25     dis[1]=0;
 26     while(!q.empty()){
 27         t=q.front();
 28         q.pop_front();
 29         vis[t]=0;
 30         for(j=head[t];j!=0;j=a[j].next){
 31             int v=a[j].v;
 32             if(dis[v]>dis[t]+a[j].w){
 33                 dis[v]=dis[t]+a[j].w;
 34                 if(!vis[v])
 35                 {
 36                     vis[v]=1;
 37                     if(dis[v]<=dis[q.front()])
 38                         q.push_front(v); 
 39                     else
 40                         q.push_back(v);  
 41                 }
 42             }
 43         }
 44     }
 45     if(dis[n]!=0x3f3f3f3f)
 46         printf("%d
",dis[n]);
 47     else
 48         cout<<"qwb baka"<<endl;//1和n不连通  
 49 }
 50 void spfabest(){
 51     memset(dis, 0x3f, sizeof(dis));
 52     deque<int> q;
 53     q.push_back(1);
 54     vis[1] = 1;
 55     dis[1] = 0;
 56     int cnt = 1,sum=0;
 57     while (!q.empty()) 
 58     {
 59         t = q.front();
 60        // cout<<"t="<<t<<endl;
 61 //        while (cnt*dis[t] > sum) 
 62 //        {
 63 //            q.pop_front();
 64 //            q.push_back(t);
 65 //            t = q.front();
 66 //        }把这个LLL优化屏蔽掉就过了 
 67         while (cnt*dis[t] > sum) 
 68         {
 69             q.pop_front();
 70             q.push_back(t);
 71             t = q.front();
 72         }
 73         q.pop_front();
 74         cnt--;
 75         sum-=dis[t];
 76         vis[t] = 0;
 77         for(j=head[t];j!=0;j=a[j].next){
 78             //cout<<"j="<<j<<endl;
 79             int v=a[j].v;
 80             if(dis[v]>dis[t]+a[j].w){
 81                 dis[v]=dis[t]+a[j].w;
 82                 if(!vis[v])
 83                 {
 84                     vis[v]=1;
 85                     if(dis[v]<=dis[q.front()]){
 86                         q.push_front(v); 
 87                     }
 88                     else
 89                         q.push_back(v);  
 90                     sum += dis[v];
 91                        cnt++;
 92                 }
 93             }
 94             //printf("sum=%d,cnt=%d
",sum,cnt);
 95         }
 96     }
 97     if(dis[n]!=0x3f3f3f3f)
 98         printf("%d
",dis[n]);
 99     else
100         cout<<"qwb baka"<<endl;//1和n不连通  
101 }
102 int main(){
103     sc();
104     spfabest();
105 } 
106  
View Code

先上题目链接 https://ac.nowcoder.com/acm/contest/96/E

emmm,以后写博客一定贴题目链接,提高食用效果。

以上是关于spfa与SLF和LLL(复习)的主要内容,如果未能解决你的问题,请参考以下文章

Spfa + SLF&LLL优化

SPFA+SLF+LLL优化模板

spfa + slf优化

SPFA的两种优化

SPFA 可不可以优化。。

题解——Acwing.342 道路与航线