• SPFA+SLF+LLL优化模板


     1 #include<algorithm>
     2 #include <iostream>
     3 #include  <cstdlib>
     4 #include  <cstring>
     5 #include  <climits>
     6 #include   <cstdio>
     7 #include   <string>
     8 #include    <cmath>
     9 #include    <stack>
    10 #include    <deque>
    11 
    12 using namespace std;
    13 const int INF=1<<30;
    14 const int gg=200000 + 11;
    15 int head[gg];
    16 int dis[gg];
    17 int n,m;
    18 int cnt;
    19 bool vis[gg];
    20 int sum,tot;
    21 struct node{
    22     int net;
    23     int to;
    24     int w;
    25 }a[gg];
    26 
    27 inline void add(int i,int j,int w)
    28 {
    29     a[++cnt].to=j;
    30     a[cnt].net=head[i];
    31     a[cnt].w=w;
    32     head[i]=cnt;
    33 }
    34 
    35 inline void spfa(int s)
    36 {
    37     deque<int>q;
    38     for(int i=1;i<=n;i++)
    39         dis[i]=INF;
    40     dis[s]=0;
    41     vis[s]=true;    
    42     q.push_back(s);
    43     tot=1;
    44     while(!q.empty())
    45     {
    46         int u=q.front();
    47         q.pop_front();
    48         vis[u]=false;
    49         tot--;
    50         sum-=dis[u];
    51         for(int i=head[u];~i;i=a[i].net)
    52         {
    53             int v=a[i].to;
    54             if(dis[v]>dis[u]+a[i].w)
    55             {
    56                 dis[v]=dis[u]+a[i].w;
    57                 if(!vis[v])
    58                 {
    59                     vis[v]=true;
    60                     if(q.empty()||dis[v]>dis[q.front()]||dis[v]*tot<=sum)
    61                     q.push_back(v);
    62                     tot++;
    63                     sum+=dis[v];
    64                 }
    65             }
    66         }
    67     }
    68 }
    69 
    70 int main()
    71 {
    72     memset(head,-1,sizeof(head));
    73     cin>>n>>m;
    74     for(int i=1;i<=m;i++)
    75     {
    76         int a,b,c;
    77         cin>>a>>b>>c;
    78         add(a,b,c);
    79         add(b,a,c);
    80     }
    81     spfa(1);
    82     if(dis[n]==INF)
    83     {
    84         cout<<-1<<endl;
    85         return 0;
    86     }
    87     else
    88     {
    89         cout<<dis[n]<<endl;
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    Vue 目录
    【SVN】彻底 svn 服务器上的 删除某一个文件或文件夹
    【Linux】安装 PostgreSQL
    【Linux】安装 node.js
    在vue中使用echarts图表
    Grunt搭建自动化web前端开发环境--完整流程
    JavaScript 开发规范
    React设计思想
    js闭包的理解
    pytharm安装第三方库
  • 原文地址:https://www.cnblogs.com/Hammer-cwz-77/p/7807645.html
Copyright © 2020-2023  润新知