poj 1201 Intervals

来源:互联网 发布:linux 没有rc.d 编辑:程序博客网 时间:2024/05/19 02:42
差分约束系统,对每个约束,则有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 1000000struct 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;}

原创粉丝点击