poj 1201&hdu1384 差分约束系统

今天第一次做差分约束系统的题,以前看过不过没用看太明白就放了,今天再次静下来好好的把它pass了,看了几个小时就找了道题做,中间有一个细节一直没太明白,就是关于边界为什么要加一或者减一。晚上的时候跟超神聊时,他提了下 我就突然明白了,这样是为了边界点不被重负计算。

View Code
 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 #define MAX_INT 123456789
6 struct node
7 {
8 int v;
9 int value;
10 int next;
11 };
12 int head[51000],dist[51000],visit[51000],N;
13 node edge[151000];
14 int vv[15100000];
15
16 int add(int s,int t,int w)
17 {
18 node e={t,w,0};
19 edge[N]=e;
20 edge[N].next=head[s];
21 head[s]=N++;
22 return 0;
23 }
24 int spfa(int min1,int max1)
25 {
26 int i,j,e,v,re,rc;
27 for(i=min1;i<=max1;i++)
28 dist[i]=-MAX_INT;
29 re=0;rc=1;
30 vv[re]=min1;
31 visit[min1]=1;
32 dist[min1]=0;
33
34 while(re<rc)
35 {
36 e=vv[re++];
37
38 for(j=head[e];j;j=edge[j].next)
39 if(dist[v=edge[j].v]<dist[e]+edge[j].value)
40 {
41 dist[v]=dist[e]+edge[j].value;
42 if(!visit[v])
43 {
44 visit[v]=1;
45 vv[rc++]=v;
46 }
47 }
48
49 visit[e]=0;
50 }
51 return dist[max1];
52 }
53 int main()
54 {
55 int i,n,s,t,w,min1,max1;
56 while(scanf("%d",&n)!=EOF)
57 {
58 min1=MAX_INT; max1=-MAX_INT;
59 memset(head,0,sizeof(head));
60 memset(visit,0,sizeof(visit));
61 for(N=1,i=0;i<n;i++)
62 {
63 scanf("%d%d%d",&s,&t,&w);
64 add(s,t+1,w);
65 if(min1>s) min1=s;
66 if(max1<t+1) max1=t+1;
67 }
68 for(i=min1; i<max1;i++)
69 {
70 add(i,i+1,0);
71 add(i+1,i,-1);
72 }
73 printf("%d\n",spfa(min1,max1));
74 }
75 return 0;
76 }
posted @ 2011-08-25 19:59  我们一直在努力  阅读(264)  评论(0编辑  收藏  举报