POJ 3169 Layout(最短路解差分约束)
Description
N头牛(1~N)按序号排成一排
L个最大距离限制:某两头牛至多相距某个距离
D个最小距离限制:某两头牛至少相距某个距离
求第一头牛与第n头牛之间的最大距离
差分约束系统
如果一个系统由n个变量和m个约束条件组成,
形成m个形如 ai - aj ≤ k 的不等式(i,j∈[1,n],k为常数),
则称其为差分约束系统
举例
给定n个变量和m个不等式,
每个不等式的形式为 x[i] - x[j] <= a[k] (0 <= i, j < n, 0 <= k < m, a[k]已知),
求 x[i] - x[j] 的最大值。
例如当n = 4,m = 5,给出如下图所示的不等式组,求x3 - x0的最大值
观察x3 - x0的性质,我们如果可以通过不等式的两两加和得到c个形如 x3 - x0 <= Ti 的不等式,那么 min{ Ti | 0 <= i < c } 就是我们要求的x3 - x0的最大值
x3 - x0 <= 8 (3)
x3 - x0 <= 9 (2)+(5)
x3 - x0 <= 7 (1)+(4)+(5)
要同时满足,答案取7
求差分约束系统转为求单源最短路
- 1
令dis[i] = x[i],令i = v, j = u, a[k] = w(j, i)
- 1
- 2
似最短路
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
相应转化后,要求1到n最大距离
最大对应到题目上,(L个)每个最大距离都取等号,才能对应“最大”
那为什么是求最短路(最小距离)呢?
x3 - x0 <= 8
x3 - x0 <= 9
x3 - x0 <= 7
这里多条路只能选最短的那条(因为要同时满足三个不等式),这就对应起来了
补充
- 存在负环:dis[n]可无限小, -1
- 图不连通:dis[n] == INF, -2
Code
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
部分原文来自:
http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
https://blog.csdn.net/my_sunshine26/article/details/72849441