poj 3159 差分约束+spfa

由于此题数据特殊,队列优化的spfa会超时,可以改成用栈来优化。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 const int INF = 9999999;
 8 const int N = 30001;
 9 const int M = 150000;
10 int head[N];
11 int dist[N];
12 bool visit[N];
13 int n, m, e;
14
15 struct Edge
16 {
17     int v, next, w;
18 } edge[M];
19
20 void addEdge( int u, int v, int w )
21 {
22     edge[e].v = v;
23     edge[e].w = w;
24     edge[e].next = head[u];
25     head[u] = e++;
26 }
27
28 void spfa( int s )
29 {
30     for ( int i = 1; i <= n; i++ )
31     {
32         dist[i] = INF;
33         visit[i] = false;
34     }
35     dist[s] = 0;
36     visit[s] = true;
37     int q[N], top = 0;
38     q[top++] = s;
39     while ( top )
40     {
41         int u = q[--top];
42         visit[u] = false;
43         for ( int j = head[u]; j != -1; j = edge[j].next )
44         {
45             int v = edge[j].v, w = edge[j].w;
46             if ( dist[v] > dist[u] + w )
47             {
48                 dist[v] = dist[u] + w;
49                 if ( !visit[v] )
50                 {
51                     q[top++] = v;
52                     visit[v] = true;
53                 }
54             }
55         }
56     }
57 }
58
59 int main ()
60 {
61     while ( scanf("%d%d", &n, &m) != EOF )
62     {
63         e = 0;
64         memset( head, -1, sizeof(head) );
65         while ( m-- )
66         {
67             int u, v, w;
68             scanf("%d%d%d", &u, &v, &w);
69             addEdge( u, v, w );
70         }
71         spfa(1);
72         printf("%d\n", dist[n]);
73     }
74     return 0;
75 }
时间: 2024-10-09 22:16:53

poj 3159 差分约束+spfa的相关文章

POJ 3159[差分约束]

题目链接:[http://poj.org/problem?id=3159] 题意:有N个小朋友,编号为1-N,每个小朋友将分的一些糖果,给出一些关系A.B.C .表示B最多比A多C个,然后问你盆友1和盆友N的糖果数最大差多少.保证有解. 题解:差分约束求最短距离:DIJ+对优化||SPAF+栈优化 #include<queue> #include<cstdio> #include<cstring> #include<algorithm> using name

poj 1201 差分约束+spfa

非常经典的差分约束系统的建模.求最小值需要转化为求最长路. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = 99999999; 8 const int N = 50002; 9 const int M = 200000; 10 int head[N];

POJ 3169 Layout (差分约束+SPFA)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6832   Accepted: 3292 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

poj 3169 差分约束

3169 差分约束的是满足多组形如xi-yj<=bk{i,j<n k<m}不等式极值问题,可以转化为单源最短路来求. 在最短路中 d[v]<=d[u]+w(u,v) 可以看出跟上面的不等式很像 通常有两种一种是求满足所有不等式的最大值,还有是最小值. 这篇博客可以参考一下 分析: 题目给出了两种不等式  d[u]+dl >=d[v]       d[u]+dd<=d[v]  要求的是最大值,也就是最短路 对于d[u]+dl>=d[v] 建边(u,vdl) 对于d[

ZOJ 2770 Burn the Linked Camp 差分约束+SPFA

第一道正儿八经的差分约束题 有排成一列的n个点,首先告诉你每个点的值最多是多少(最少显然要大于0),然后告诉你m段i,j,k,表示第i个点到第j个点的值的和至少有k,问你总和至少为多少. 要注意的是,告诉你的所有关系式都不要忘记建边,一开始漏了大于0的条件调半天o(╯□╰)o 不等式的形式是a-b<=c这样的= = 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <

POJ 3159 Candies(SPFA+栈)差分约束

题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c  最后求fly[n]最多能比so[1] 多多少糖? 差分约束问题, 就是求1-n的最短路,  队列实现spfa 会超时了,改为栈实现,就可以 有负环时,用栈比队列快 数组开小了,不报RE,报超时 ,我晕 #include <iostream> #include <cstdlib> #include <cstdio>

POJ 3159 Candies(差分约束+spfa+链式前向星)

题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A的糖果数<=C . 最后求n 比 1 最多多多少颗糖果. 解题思路:经典差分约束的题目,具体证明看这里<数与图的完美结合——浅析差分约束系统>. 不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,我们得到 dis[B]-dis[A]<=w(A,B).看到这里,我们可以联想到

(简单) POJ 3169 Layout,差分约束+SPFA。

Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a straight line waiting for feed. The cows are standing in the same order as they are numbe

poj 1201 Intervals【差分约束+spfa】

设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束,就是连边(bi,ai-1,-li),(i-1,i,1),(i,i-1,0) spfa跑最长路最后输出相反数即可,注意n是起点,min是终点,跑最短路(不会有负环) #include<iostream> #include<cstdio> #include<queue> usi