hdoj1384

无语啊,一个细节花了我一上午的时间,提交了40多次!

Problem : 1384 ( Intervals )     Judge Status : Accepted
RunId : 2659165    Language : G++    Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Thu 22 Jul 2010 10:32:53 AM CST
*File Name: main.cpp
*Description:差分约束系统
\***************************************************************/

//*========================*Head File*========================*\\

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
struct
E{
int
s,e,len;
}
edges[
151001];
int
_min,_max,n,dist[
50002];//这个地方应大于50001,因为后面加1
//的缘故,就因为错这一点,我花了一
//上午的时间!
//*=======================*Main Program*=======================*//
using namespace std;

int
main(){

//freopen("input","r",stdin);
while(scanf("%d",&n)!=EOF){
_min=
99999;
_max=-
1;
for
(int i=
0;i<n;++i){//s[b]-s[a-1]>c
scanf("%d%d%d",&edges[i].s,&edges[i].e,&edges[i].len);
edges[i].e++;
//之所以加1,是因为数据是从0开始的S[b]-S[a-1]>c
//a-1可能会<0,所以全加1

if
(_min>edges[i].s)
//最小顶点
_min=edges[i].s;
if
(_max<edges[i].e)
//最大顶点
_max=edges[i].e;
}

for
(int i=_min;i<_max;++i){
//s[b]-s[b-1]>=0
edges[n].s=i;//用n来记录边的数目
edges[n].e=i+1;
edges[n].len=
0;
n++;
}

for
(int i=_max;i>_min;i--){
//s[b]-s[b-1]<=1即s[b-1]-s[b]>=-1
edges[n].s=i;
edges[n].e=i-
1;
edges[n].len=-
1;
n++;
}

memset(dist,-
1,sizeof(dist));
dist[_min]=
0;
int
s,e,len;
for
(int i=
0;i<_max-_min;i++){//Bellman-Ford求最长路径
bool flag=1;
for
(int j=
0;j<n;j++){
s=edges[j].s,e=edges[j].e,len=edges[j].len;
if
(dist[s]!=-
1&&dist[e]<dist[s]+len){
flag=
false;
dist[e]=dist[s]+len;
}
}

if
(flag)break;
}

printf(
"%d\n",dist[_max]);
}
}


posted @ 2010-07-22 13:24  open source  阅读(172)  评论(0编辑  收藏  举报