zoukankan      html  css  js  c++  java
  • 【模板】前向星 SPFA求最短(长)路

    之前一个改自别人的模板竟然在一道题上TLE了,而代码也实在丑陋,网上找得到的模板也大多跑得慢(vector存图)或代码丑陋、残疾(无初始化函数的模板能叫模板吗?),索性自己重新写了一个。

    题是POJ1716(差分约束模型),需要求最长路,其实跟最短路也只有很小的差别。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<vector>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 // 最长路,改为最短路只需修改两个注释了的地方
     8 const int MAXN = 10011, MAXM = 30033;
     9 int N,dis[MAXN],cnt[MAXN],head[MAXN],tot;
    10 bool inq[MAXN];
    11 struct Edge{
    12     int v, w, nxt;
    13 }e[MAXM];
    14 void init(int n){
    15     tot = 0; N = n;
    16     memset(head,-1,sizeof head);
    17     memset(inq,0,sizeof inq);
    18     memset(cnt,0,sizeof cnt);
    19     fill(dis,dis+N+1,-1e9);     /// 1
    20 }
    21 void addEdge(int u,int v,int w){
    22     e[tot] = {v,w,head[u]};
    23     head[u] = tot++;
    24 }
    25 bool SPFA(int s){
    26     queue<int> que;
    27     inq[s] = 1; dis[s] = 0;
    28     que.push(s);
    29     while(!que.empty()){
    30         int x = que.front(); que.pop();
    31         inq[x] = 0;
    32         for(int i = head[x];~i;i = e[i].nxt){
    33             int v = e[i].v, w = e[i].w;
    34             if(dis[v] < dis[x] + w){    /// 2
    35                 dis[v] = dis[x] + w;
    36                 if(!inq[v]){
    37                     inq[v] = 1; que.push(v);
    38                     if(++cnt[v] > N) return 0;
    39                 }
    40             }
    41         }
    42     }
    43     return 1;
    44 }
    45 
    46 int n;
    47 
    48 int main(){
    49     cin >> n;
    50     init(10007);
    51     for(int i = 0;i < n;++i){
    52         int a,b;
    53         scanf("%d%d",&a,&b);
    54         addEdge(a,b+1,2);
    55     }
    56     for(int i = 0;i <= 10000;++i){
    57         addEdge(i,i+1,0);
    58         addEdge(i+1,i,-1);
    59     }
    60     SPFA(0);
    61     printf("%d
    ",dis[10001]);
    62 
    63     return 0;
    64 }
  • 相关阅读:
    OAuth2.0说明文档
    CentOS直接解压可用的memcached、nginx、keepalived
    CentOS离线安装GCC编译环境
    [交通安全]电动自行车认定为非机动车的文件
    修改sublime列编辑快捷键
    手机号归属地接口
    ubuntu下typora的gitee图床配置-----基于picgo
    spyder无法切换中文输入法
    lightgbm直方图算法
    xgboost原理分析
  • 原文地址:https://www.cnblogs.com/doub7e/p/7622770.html
Copyright © 2011-2022 走看看