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 }
  • 相关阅读:
    springboot/springcloud 启动速度慢 卡死问题
    数据分析路线
    java杂
    贪吃蛇
    设计模式的七大原则
    Java--GUI编程(三)总结AWT/Swing
    时间复杂度
    Java--GUI编程(二)简易加法计算器
    Java--GUI编程(一)
    Java--this与super区别
  • 原文地址:https://www.cnblogs.com/doub7e/p/7622770.html
Copyright © 2011-2022 走看看