您的位置:首页 > 其它

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: