初学差分约束,差分约束的概念还是比较好理解的,但是在题目中的应用对我来说还是不熟练。
这道题就是用一个数组dis[x]来记录0-X区间内,点的个数,那么列出3个式子:
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;
int dis[10001];
struct edge
{
int u,v;
}vetex[10001];
int ulim(-1),dlim(10001),n;
int main()
{
while(cin>>n)
{
int a,b;ulim = -1;dlim = 10001;
for(int i=1;i!=n+1;i++)
{
cin>>a>>b;
vetex[i].u = a;
vetex[i].v = b+1;
if(a<dlim)
dlim = a;
if(b+1>ulim)
ulim = b+1;
dis[i] = 0;
}
bool flag(true);
while(flag)
{
flag = false;
for(int i=1;i!=n+1;i++)
{
if(dis[vetex[i].u] > dis[vetex[i].v]-2)
{
dis[vetex[i].u] = dis[vetex[i].v] - 2;
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+1]<dis[i])
{
dis[i] = dis[i+1];
flag = true;
}
}
}
cout<<dis[ulim]-dis[dlim]<<endl;
}
return 0;
}