与 zoj 1508 Intervals相同,均为差分约束,http://blog.csdn.net/unimen/article/details/6719738
/*
Name: poj 1716Integer Intervals
Author: Unimen
Date: 27/08/11 09:53
Description: 差分约束
*/
/*
解题报告:与zoj 1508Intervals 相同
*/
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 10010;
struct
{
int a, b;
}Edge[MAXN];
int n;
int iMax, iMin;
int dis[MAXN];
int bellman_ford()
{
int i;
bool bUpdata = true;
while(bUpdata)
{
bUpdata = false;
for(i=1; i<=n; ++i)
{
if(dis[Edge[i].b] < dis[Edge[i].a] + 2)
{
dis[Edge[i].b] = dis[Edge[i].a] + 2;
bUpdata = true;
}
}
for(i=iMin; i<=iMax; ++i)
{
if(dis[i] < dis[i-1])
{
dis[i] = dis[i-1];
bUpdata = true;
}
}
for(i=iMax; i>=iMin; --i)
{
if(dis[i-1] < dis[i] -1)
{
dis[i-1] = dis[i] - 1;
bUpdata = 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;
cin>>a>>b;
Edge[i].a = a - 1;
Edge[i].b = b;
if(iMin > a)
iMin = a;
if(iMax < b)
iMax = b;
}
memset(dis, 0, sizeof(dis));
cout<<bellman_ford()<<endl;
}
return 0;
}