zoj 1508 Intervals

来源:互联网 发布:广州淘宝实景摄影棚 编辑:程序博客网 时间:2024/05/22 08:15
/*  Name: zoj 1508 Intervals  Author: Unimen  Date: 25/08/11 20:50  Description: 差分约束 *//*解题报告:详见06年冯威论文技巧:不用单独的建图,简图和寻找最短路径可以结合起来,另外论文中说负的权值,这里也不用,原因是见注释地方的代码,这样整好相当于把负号给抵消了,没有必要给负权值了 注意:应该将dis数组清为0,因为如dis[Edge[i].b] < dis[Edge[i].a] + Edge[i].w,只有取最小值才更新,因为是小于号  */#include <iostream>#include <cstring>using namespace std;const int MAX = 50010;struct {int a, b, w;}Edge[MAX];int n;int dis[MAX];int iMax, iMin;int bellman_ford(){int i;bool bUpdate = true;while(bUpdate){bUpdate = false;for(i=1; i<=n; ++i){if(dis[Edge[i].b] < dis[Edge[i].a] + Edge[i].w){dis[Edge[i].b] = dis[Edge[i].a] + Edge[i].w;bUpdate = true;}}for(i=iMax; i>=iMin; --i){if(dis[i-1] < dis[i] - 1){dis[i-1] = dis[i] - 1;bUpdate = true;}}for(i=iMin; i<=iMax; ++i){if(dis[i] < dis[i-1]){dis[i] = dis[i-1];bUpdate = true;}}}return dis[iMax] - dis[iMin-1];  //注释 }int main(){int i;while(cin>>n){iMax = 0, iMin = 1000000000;//读入数据 for(i=1; i<=n; ++i){int a, b, w;cin>>a>>b>>w;Edge[i].a = a - 1;Edge[i].b = b;Edge[i].w = w;if(iMax < b)iMax = b;if(iMin > a)iMin = a;}memset(dis, 0, sizeof(dis)); //注意这里应该清为0,想想为什么应该是0cout<<bellman_ford()<<endl;}return 0;}

原创粉丝点击