1.对于每个不等式s[i]-s[j]<=k,向(j,i)加一条权重为k的边;对于每个不等式s[i]-s[j]>=k,向(i,j)加一条权重为k的边;
增加源点s,并向所有点加一条权重为0的边;求最短路径求得的d[]是s[]的一组解,且是最大解(或求从t到s的最短路,d[s]为最小解)
2.对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值
注意:1.若Spfa返回false(图中出现负环,某些点不可达),则说明无解;
2.注意相邻两点间的边(i,i+1,1),(i+1,i,0);
3.注意区间开闭与字段和之间转换;
4.求最大值时,边反向,权反向,最长最短反向
Poj 1716 Integer Intervals
题意:给出若干个闭区间,每个区间内至少有2个正数,问至少需要多少个整数。
解:闭区间转换为开区间S[i]从0到i左闭右开区间内所需个数。
对于每个区间(i,j),s[j+1]-s[i]>=2,加边(i,j,2);
0<=s[i+1]-s[i]<=1,加边(i+1,i,-1)和(i,i+1,0);
以所有约束区间最左端的点为起点做源点,最右端的端点做终点求最长路。
poj 1201 Intervals
题意:每个区间[ai, bi]至少存在ci个元素,问至少需要多少个,类似于1716
poj 1275 Cashier Employment
题意:给出每个小时需要的人数,及n名应聘者开始工作的时间(连续工作8小时),问至少需要雇佣多少名员工。
解:每个小时需求need [],每个小时开始工作的应聘者数目r[].前i小时实际雇佣人数 s[],不等式:
0<=s[i]-s[i-1]<=r[i]
s[i]-s [i-8]>=need[i](9<=i<=24)
s[i] -(ans-s[i+16])>=need[i](1<=i<=8)
因为ans未知,所以需要二分枚举ans,且加边(0,24,-ans),若存在解则证明可行。
poj 3169 Layout
判环求 s[n]-s[1]<=ans,最大值求解问题