http://blog.csdn.net/rookie_algo/article/details/7833801
和1716一樣,差分約束,列出以下式子:
1、s[bi]-s[ai-1]>=2
2、s[i+1]-s[i]>=0
3、s[i+1]-s[i]<=1
#include<iostream>
using namespace std;
const int MAXN = 50001;
struct edge
{
int u,v,w;
}vetex[MAXN];
int dis[MAXN];
int ulim,dlim;
int main()
{
int n;
while(cin>>n)
{
ulim = -1;dlim = MAXN;
for(int i=1;i!=n+1;i++)
{
cin>>vetex[i].u;
cin>>vetex[i].v;
++vetex[i].v;
cin>>vetex[i].w;
dis[i] = 0;
if(ulim<vetex[i].v)
{
ulim=vetex[i].v;
}
if(dlim>vetex[i].u)
{
dlim=vetex[i].u;
}
}
bool flag = true;
while(flag)
{
flag = false;
for(int i=1;i!=n+1;i++)
{
if(dis[vetex[i].u]>dis[vetex[i].v]-vetex[i].w)
{
dis[vetex[i].u]=dis[vetex[i].v]-vetex[i].w;
flag = true;
}
}
for(int i=dlim;i!=ulim+1;i++)
{
if(dis[i+1]>dis[i]+1)
{
dis[i+1] = dis[i]+1;
flag = true;
}
}
for(int i=ulim;i!=dlim-1;i--)
{
if(dis[i]>dis[i+1])
{
dis[i] = dis[i+1];
flag = true;
}
}
}
cout<<dis[ulim]-dis[dlim]<<endl;
}
return 0;
}