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 }

 

你可能感兴趣的:(差分约束)