差分约束学习博客

无意之间从算法导论看到了差分约束,花了一个小时简单的学了学

参考博客:博客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解。

发布了519 篇原创文章 · 获赞 69 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/105527799