码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-10-02 23:04:45      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:class   ++   差分   模板   can   scan   space   mem   style   

之前一个改自别人的模板竟然在一道题上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 }

 

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

标签:class   ++   差分   模板   can   scan   space   mem   style   

原文地址:http://www.cnblogs.com/doub7e/p/7622770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!