【模板】前向星 SPFA求最短(长)路

本文分享了一段SPFA算法实现最长路径计算的代码,并针对POJ1716问题进行了详细解析。代码中实现了从初始化到加入边,再到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\n",dis[10001]);
62 
63     return 0;
64 }

 

转载于:https://www.cnblogs.com/doub7e/p/7622770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值