1 差分约束系统 2 加一个源点s指向所有点边权为0, 3 加一个汇点t,所有点指向t边权为0, 4 u和v安全距离为w,则加边v->u,边权为-w 5 (因为 u-v>=w 所以v-u<=-w ) 6 求s到t最短路即可。 7 http://acm.hdu.edu.cn/showproblem.php?pid=4109 8 #include<stdio.h> 9 const int N=10000; 10 #define max 999999 11 int dis[N],num,n; 12 struct node 13 { 14 int b; 15 int e; 16 int w; 17 18 }p[N]; 19 void init() 20 { 21 int i; 22 for(i=0;i<=n+1;i++) 23 dis[i]=0; 24 } 25 void insert(int x,int y,int z) 26 { 27 p[num].b=x; 28 p[num].e=y; 29 p[num].w=z; 30 num++; 31 } 32 void bellman() 33 { 34 int i,j; 35 36 for(i=1;i<=n+1;i++) 37 { 38 for(j=0;j<num;j++) 39 { 40 if(dis[p[j].e]>dis[p[j].b]+p[j].w) 41 { 42 dis[p[j].e]=dis[p[j].b]+p[j].w; 43 } 44 } 45 } 46 } 47 int main() 48 { 49 int m,i,x,y,z; 50 while(scanf("%d%d",&n,&m)!=EOF) 51 { 52 num=0; 53 init(); 54 for(i=1;i<=m;i++) 55 { 56 scanf("%d%d%d",&x,&y,&z); 57 insert(x+1,y+1,-z); 58 59 } 60 61 for(i=1;i<=n;i++) 62 { 63 insert(0,i,0); 64 insert(i,n+1,0); 65 } 66 bellman(); 67 //for(i=0;i<=n+1;i++)printf("%d\n",dis[i]); 68 printf("%d\n",1-dis[n+1]); 69 70 } 71 }