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;}