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 }