对于差分约束系统,注意:
1,加入源点,保证其他每个顶点到源点可达(对于此题,可以不加);
2,要找出题目中所有隐含关系;
3,>=、<=的方向要统一。(这个涉及到求最短路,或者最长路)
#include <cmath>
#include <cstdio>
#include <memory.h>
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
int n;
class node
{
public:
int u,v,cost;
};
node e[90900];
int index,min_n,max_n;
int dist[10010];
void adde(int a,int b,int c)
{
e[index].u =a;
e[index].v =b;
e[index].cost =c;
index++;
}
void in()
{
int a,b,c=-2;
index=0;max_n=-1;min_n=1e10;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
b++;
max_n=max_n>b?max_n:b;
min_n=min_n<a?min_n:a;
adde(b,a,-2);
}
//for(int i=min_n;i<=max_n;i++)
// adde(i,0,0);//源点可以不要
for(int i=min_n;i<max_n;i++)
adde(i,i+1,1);
for(int i=max_n;i>min_n;i--)
adde(i,i-1,0);
}
void bellman()
{
int i,j;
for(i=0;i<=max_n;i++)
dist[i]= 10000;
for(int i=min_n;i<=max_n;i++)
{
int f=1;
for(j=0;j<index;j++)
{
if(dist[e[j].v ]>dist[e[j].u ]+e[j].cost )
{
dist[e[j].v ]=dist[e[j].u ]+ e[j].cost ;
f=0;
}
}
if(f) break;
}
cout<<dist[max_n]-dist[min_n]<<endl;
}
int main()
{
while(cin>>n)
{
in();
bellman();
}
return 0;
}