POJ 1201 Intervals
2013-01-02 17:06
309 查看
d[i]=区间[0,i)中所有的整点数。得到两个不等式:
d[b+1]-d[a]<=c,0<=d[i+1]-d[i]<=1;
根据这两个不等式来做差分约束。
View Code
d[b+1]-d[a]<=c,0<=d[i+1]-d[i]<=1;
根据这两个不等式来做差分约束。
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define maxn 50010 #define maxm 150010 using namespace std; int first[maxn],d[maxn],inq[maxn]; int v[maxm],next[maxm],w[maxm]; int e,n; void init() { e = 0; memset(first,-1,sizeof(first)); } void add_edge(int a,int b,int c) { v[e] = b,next[e] = first[a],first[a] = e,w[e] = c,e++; } int spfa(int min1,int max1) { queue<int> q; int i,ith; for(i = min1;i <= max1;i++) { d[i] = -maxn; inq[i] = 0; } d[min1] = 0; q.push(min1); inq[min1] = 1; while(!q.empty()) { ith = q.front(); q.pop(); inq[ith] = 0; for(i = first[ith];i != -1;i = next[i]) { if(d[v[i]] < d[ith] + w[i]) { d[v[i]] = d[ith] + w[i]; if(!inq[v[i]]) { q.push(v[i]); inq[v[i]] = 1; } } } } return d[max1]; } int main() { while(scanf("%d",&n) == 1) { int max1 = -maxn,min1 = maxn; int i,a,b,c; init(); for(i = 1;i <= n;i++) { scanf("%d%d%d",&a,&b,&c); add_edge(a,b + 1,c); max1 = b > max1 ? b : max1; min1 = a < min1 ? a : min1; } max1++; for(i = min1;i < max1;i++) { add_edge(i,i + 1,0); add_edge(i + 1,i,-1); } printf("%d\n",spfa(min1,max1)); } return 0; }
相关文章推荐
- Intervals--POJ 1201
- POJ1201 Intervals
- POJ 1201 Intervals[差分约束]
- POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束
- POJ 1201 Intervals
- poj 1201 Intervals
- POJ 1201 Intervals (差分约束系统)
- poj 1201 Intervals
- POJ 1201 Intervals (差分约束) - from lanshui_Yang
- [POJ] 1201 Intervals [差分约束]
- POJ-1201/HDU-1384 Intervals
- POJ 1201 Intervals(图论-差分约束)
- POJ 1201 && HDU 1384 Intervals 差分约束系统
- poj 1201 Intervals 解题报告
- 图论(差分约束系统):POJ 1201 Intervals
- POJ 1201 Intervals (差分约束)
- *POJ 1201 - Intervals(查分约束)
- POJ 1201/hdu 1384 Intervals【差分约束+SPFA】
- zoj 1508 | poj 1201 Intervals
- POJ训练计划1201_Intervals(差分约束)