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 }