POJ 1201 Intervals

d[i]=区间[0,i)中所有的整点数。得到两个不等式:

d[b+1]-d[a]<=c,0<=d[i+1]-d[i]<=1;

根据这两个不等式来做差分约束。

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #define maxn 50010
 6 #define maxm 150010
 7 using namespace std;
 8 
 9 int first[maxn],d[maxn],inq[maxn];
10 int v[maxm],next[maxm],w[maxm];
11 int e,n;
12 
13 void init()
14 {
15     e = 0;
16     memset(first,-1,sizeof(first));
17 }
18 
19 void add_edge(int a,int b,int c)
20 {
21     v[e] = b,next[e] = first[a],first[a] = e,w[e] = c,e++;
22 }
23 
24 int spfa(int min1,int max1)
25 {
26     queue<int> q;
27     int i,ith;
28     for(i = min1;i <= max1;i++)
29     {
30         d[i] = -maxn;
31         inq[i] = 0;
32     }
33     d[min1] = 0;
34     q.push(min1);
35     inq[min1] = 1;
36     while(!q.empty())
37     {
38         ith = q.front();
39         q.pop();
40         inq[ith] = 0;
41         for(i = first[ith];i != -1;i = next[i])
42         {
43             if(d[v[i]] < d[ith] + w[i])
44             {
45                 d[v[i]] = d[ith] + w[i];
46                 if(!inq[v[i]])
47                 {
48                     q.push(v[i]);
49                     inq[v[i]] = 1;
50                 }
51             }
52         }
53     }
54     return d[max1];
55 }
56 int main()
57 {
58     while(scanf("%d",&n) == 1)
59     {
60         int max1 = -maxn,min1 = maxn;
61         int i,a,b,c;
62         init();
63         for(i = 1;i <= n;i++)
64         {
65             scanf("%d%d%d",&a,&b,&c);
66             add_edge(a,b + 1,c);
67             max1 = b > max1 ? b : max1;
68             min1 = a < min1 ? a : min1;
69         }
70         max1++;
71         for(i = min1;i < max1;i++)
72         {
73             add_edge(i,i + 1,0);
74             add_edge(i + 1,i,-1);
75         }
76         printf("%d\n",spfa(min1,max1));
77     }
78     return 0;
79 }

 

posted @ 2013-01-02 17:06  浙西贫农  阅读(127)  评论(0编辑  收藏  举报