您的位置:首页 > 其它

poj 1201 Intervals

2012-08-30 14:32 302 查看
差分约束系统,对每个约束,则有dis[t]-dis[s]>=c。另外还有一个隐含的约束条件就是0<=dis[i]-dis[i-1]<=1,根据这两个条件来建图,用bellmen_ford和spfa都可以,前者要适当加以剪枝。

#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAXINT 1000000
struct EDGE{
int st,ed,val;
}edge[60000];

int dis[60000],n,mi,ma;
int MAX[60000];
int bellman_ford()
{
int i , k;
for(i = mi; i <= ma ; i++ )
dis[i] = -MAXINT ;
dis[mi] = 0 ;
bool over;
for(k = 0 ; k <= ma - mi; k ++ )
{
over = true ;

for(i = 0 ; i < n ; i ++ )
if(dis[edge[i].st] != -MAXINT && dis[edge[i].st] + edge[i].val > dis[edge[i].ed] )
{
dis[edge[i].ed] = dis[edge[i].st] + edge[i].val ;
over = false;
}

for(i=mi;i<ma;i++)
if( dis[i] != -MAXINT && dis[i] > dis[i+1] )
{
dis[i+1] = dis[i] ;
over = false ;
}

for(i = ma; i > mi ; i --)
if(dis[i] != -MAXINT && dis[i]-1 > dis[i-1])
{
dis[i-1] = dis[i]-1 ;
over = false ;
}

if(over)
break;
}
return dis[ma];
}

int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
mi=MAXINT;
ma=0;
for(i=ma;i<n;i++)
{
scanf("%d%d%d",&edge[i].st,&edge[i].ed,&edge[i].val);   ///   1<= ci <= bi - ai + 1
edge[i].ed++;
if( edge[i].ed > ma)
ma = edge[i].ed ;
if( edge[i].st < mi )
mi = edge[i].st;
}
printf("%d\n",bellman_ford());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: