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 }

 

 

你可能感兴趣的:(poj)