POJ 1201 Intervals

解题思路:差分约束+spfa

1)dist[e.y]>=dist[e.x]+dist[e.v]

2)dist[i]>=dist[i+1]-1

3)dist[i+1]>=dist[i]

分别将2,3中连续点进行合并Line 56~63

代码
1 #include<iostream>
2  using namespace std;
3  #define MAXN 50005
4 int n, m, maxX,minX,first[MAXN], next[MAXN*3];
5 struct {
6 int y, v;
7 }edge[MAXN*3];
8 inline void insert(int x, int y, int v)
9 {
10 edge[m].y=y, edge[m].v = v;
11 if(first[x])next[m]=first[x];
12 first[x]=m++;
13 }
14 int spfa()
15 {
16 int i,x, y, v,p, s, e,dist[MAXN],que[MAXN];
17 bool used[MAXN]={0};
18 s = e = 0;
19 for(i=minX;i<=maxX;i++)dist[i]=-MAXN;
20 que[e++]=minX, dist[minX]=0,used[minX]=true;
21 while(e!=s)
22 {
23 x=que[s],p=first[x];
24 while(p)
25 {
26 y=edge[p].y, v=edge[p].v;
27 if(dist[y]<dist[x]+v)
28 {
29 dist[y]=dist[x]+v;
30 if(!used[y]){used[y]=true;que[e]=y,e=(e+1)%MAXN;}
31 }
32 p=next[p];
33 }
34 s=(s+1)%MAXN;
35 used[x]=false;
36 }
37 return dist[maxX];
38 }
39 int main()
40 {
41 int i, p, q, x, y, v, l;
42 bool used[MAXN]={0};
43 scanf("%d", &n);
44 memset(first, 0, sizeof(first));
45 memset(next, 0, sizeof(next));
46 minX=MAXN, maxX = 0;
47 for(m=i=1;i<=n;i++)
48 {
49 scanf("%d %d %d", &x, &y, &v);
50 used[x]=used[y+1]=true;
51 if(x<minX)minX=x;
52 if(maxX<y+1)maxX=y+1;
53 insert(x,y+1,v);
54 }
55 p=minX;
56 while(1)
57 {
58 q=p+1;
59 while(!used[q]&&q<=maxX)q++;
60 if(q<=maxX)insert(p, q, 0), insert(q, p, p-q);
61 else break;
62 p=q;
63 }
64 l = spfa();
65 printf("%d\n", l);
66 return 0;
67 }

 

 

posted on 2011-01-20 10:52  ltang  阅读(521)  评论(0编辑  收藏  举报

导航