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 }