POJ 3159 Candies(差分约束)

题目链接

差分约束,一般求最大差值的时候 求的是最短路,求最小差值的时候求的是最长路。

题意:给出a,b,c,必须满足第b个人比第a个人至多c,b - a <= c,然后简单来说,就是求n-1的最大差值。

开始套的模版WA了,然后发现DISCUSS说,queue会超时,很奇怪,然后我用栈写,依旧WA了,不科学啊。。找了份也用spfa写的代码,发现INF开的有点大了。。。导致WA了。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <queue>
 6 using namespace std;
 7 #define N 30001
 8 #define M 150001
 9 #define INF 10000000
10 int first[N],in[N],d[N];
11 struct node
12 {
13     int u,v,next,w;
14 }edge[M];
15 int stack[10000001];
16 int t,n;
17 void add(int u,int v,int w)
18 {
19     edge[t].u = u;
20     edge[t].v = v;
21     edge[t].w = w;
22     edge[t].next = first[u];
23     first[u] = t;
24     t ++;
25 }
26 void CL()
27 {
28     t = 1;
29     memset(first,-1,sizeof(first));
30 }
31 void spfa(int str)
32 {
33     int i,u,v,top;
34     for(i = 1;i <= n;i ++)
35     {
36         d[i] = INF;
37         in[i] = 0;
38     }
39     top = 1;
40     stack[top] = str;
41     in[str] = 1;
42     d[str] = 0;
43     while(top >= 1)
44     {
45         u = stack[top];
46         top --;
47         in[u] = 1;
48         for(i = first[u];i != -1;i = edge[i].next)
49         {
50             v = edge[i].v;
51             if(d[v] > d[u] + edge[i].w)
52             {
53                 d[v] = d[u] + edge[i].w;
54                 if(!in[v])
55                 {
56                     top ++;
57                     stack[top] = v;
58                     in[v] = 1;
59                 }
60             }
61         }
62     }
63 }
64 int main()
65 {
66     int m,x,y,c,i;
67     scanf("%d%d",&n,&m);
68     CL();
69     for(i = 1;i <= m;i ++)
70     {
71         scanf("%d%d%d",&x,&y,&c);
72         add(x,y,c);
73     }
74     spfa(1);
75     printf("%d\n",d[n]);
76     return 0;
77 }

 

posted @ 2013-02-21 14:09  Naix_x  阅读(153)  评论(0编辑  收藏  举报