无意之间从算法导论看到了差分约束,花了一个小时简单的学了学
参考博客:博客1
大概意思就是,这类题一般有两种模型:
1、给你n个区间表示区间最多有多少个,然后求总的最大是多少?
2、给你n个区间表示每个区间最少有多少个,然后求总的最少是多少
例题:P1250 种树
题意:
给你m个区间b e t 表示 b到e至少种t棵树,然后求总的树最少。
分析公式:
因为是至少种t棵树,所以要写成大于等于的形式
s[e]-s[b-1]>=t //只有下界,没有上界
每个位置i可种可不种:0<=s[i]-s[i-1]<=1
s[i]-s[i-1]>=0
s[i-1]-s[i]>=1
建图:
b-1到e 建边权为t的有向边
i-1到i建边权为0的有向边
至于i到i-1为什么要建-1的有向边呢
个人理解是上面两边建立的方式都是这条边最小值,那么i到i-1的也应该是最小权值(取值有0,1)
另一个题:P3084 斑点牛
题意:
给你m个区间(l,r)表示区间l,r内有且只有一头牛 问总的最多有几头牛?
分析公式:
s[r]-s[l-1]=1
每个位置i有牛和没有牛:0<=s[i]-s[i-1]<=1
写成只有上届的形式
s[i]-s[i-1]<=1
s[i-1]-s[i]<=0
建图:
l-1到r建权值为1的有向图
r带l-1 建权值为1的有向图
i-1到1建权值为1的有向图
i到i-1建权值为0的有向图
这里一样的,每条边都是保存最大值,然后图上跑最短路就可以了。
由于图中存在负权值,没学过Bellman-Ford 只会用SPFA解。