图算法(2) --拓扑排序,2-SAT,欧拉路 - TOJ
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• Catenyms (Waterloo Jan 03)
– TOJ 1416 / POJ 2337 – 题目大意:给定一组单词,问这些单词能否 连成一串,使得前面一个单词的最后一个字 母和后面一个单词的第一个字母相同。
1
24
例题分析
0011 0010 1010 1101 0001 0100 1011 • Sample Input • Sample
1
• 检验此SAT问题是否有解,即可验证S是否可以
17
Horn-SAT
0011 0010 1010 1101 0001 0100 1011
• 每个子句里最多有一个positive literal
(¬A ∨ ¬B ∨ C ) ∧ ( B ∨ ¬D) ∧L
• 存在多项式的构造算法:
– 如果每个子句都包含大于1个变量,则所有变量 取负即为解 – 否则,存在包含1个变量的子句,则这些变量的 值可唯一确定,代入原式化简即可
– (1)编号为1的点排得越靠前越好 – (2)在满足(1)的所有序列中,2越靠前越好 – (3)…3越靠前越好 –…
1
6
例题分析
0011 0010 1010 1101 0001 0100 1011
• 仍按字典序可以么?
4 2 3 1
倒序的字典序最 大即为所求……
1
• 1应该尽可能的早……在1最早的前提下2 尽可能早…………
1
30
例题分析
0011 0010 1010 1101 0001 0100 1011
• 当k=3, b=2时,一个合法的环为:
00010111
• 数学问题?? 没有好的办法 • 暴力搜索?? 复杂度为O(b^(b^k)),无 法接受
1
31
例题分析
0011 0010 1010 1101 0001 0100 1011
6 aloha arachnid dog gopher rat tiger 3 oak maple elm
Output aloha.arachnid.dog.gopher .rat.tiger ***
1
25
例题分析
0011 0010 1010 1101 0001 0100 1011
• 容易联想到欧拉路
1
• TOJ 2730 Horn Clauses
18
欧拉路(Euler Tour)
0011 0010 1010 1101 0001 0100 1011
• 定义:经过图中每条边恰好一次的路 边 • 如果起点和终点相同,叫做欧拉回路 • 无向图存在欧拉路的条件
– 如果图连通,且所有的点都是偶数度,则有欧 拉回路。 – 如果图连通,且恰有两点是奇数度,则有欧拉 路。且欧拉路的起止点为这两个奇数度点。 – 对重边、自环的情况仍适用。
1
• DP的状态转移关系实际上就是构建在一 个DAG上的
3
拓扑排序
0011 0010 1010 1101 0001 0100 1011
• 算法
– (1) 计算每个点的入度,入度为0的点加入 队列Q – (2) 从Q中取出一个点p,输出 – (3) 所有与p相邻的点的入度减1。如果新得 到了入度为0的点,则加入队列Q。 – (4) 转步骤(2), 直到所有点都输出完毕 – 如果在执行过程中发现找不到入度为0的点, 说明图中存在环
1
20
欧拉路
0011 0010 1010 1101 0001 0100 1011
• 套圈算法
– 任意找一个经过点p的环p,V1,V2,…,Vn,p 。其中每条边都是未被访问过的。 – 对环上的每一个点Vi,递归调用步骤(1)
1
21
欧拉路
0011 0010 1010 1101 0001 0100 1011
– 每个单词相当于在首字母和尾字母之间连一 条边 – 得到一个最多26个点的有向图,求欧拉路 即可 – 注意先判断连通性 连通性
1
26
例题分析
0011 0010 1010 1101 0001 0100 1011
• Ural1124 Mosaic
– 有M种卡片,每种有N张,初始时放在M个 盒子里,每个盒子里有N张,但是可能有某 些卡片放错了位置,因此需要进行一些移动 ,最后使得每张卡片都放到它应该在的盒子 (第1种卡片都放入盒1,第2种卡片都放入 盒2 …)。 – 一次移动是指把一张卡片从当前手边的盒子 里拿出放到另一个盒子,或者不拿卡片,只 是把手从当前的盒子处移到另一个盒子处。 – 求最少的移动次数 (M<=500, n<=50) 27
1
4
拓பைடு நூலகம்排序
0011 0010 1010 1101 0001 0100 1011
1 4 3
2 6
7
8 5
1
5
拓扑序:1 3 2 4 5 6 7 8 (不唯一) 如何求出字典序最小的拓扑序列?
例题分析
0011 0010 1010 1101 0001 0100 1011
• POJ 3687 • 给定一DAG,要求拓扑序,使得满足:
16
1
例题分析
0011 0010 1010 1101 0001 0100 1011
• 设现在二分的答案是S。那么检查每一对牛栏i和j(假设 D1i,D1j表示i和j到第一个中转站的距离,D2i,D2j表示 i和j到第二个中转站的距离,DD表示两个中转站之间的 距离)。如果 • 3)D1i + D1j >S,就增加和取范式(~Xi OR ~Xj) • 4)D2i + D2j >S,就增加和取范式(Xi OR Xj) • 5)D1i + D2j + DD >S,增加和取范式(~Xi OR Xj) • 6)D2i + D1j + DD >S,增加和取范式(Xi OR ~Xj)
1
( A ∨ B ∨ C ) ∧ (¬A ∨ D) ∧ (C ∨ ¬D)
8
2-SAT
0011 0010 1010 1101 0001 0100 1011
• 2-SAT有多项式算法
– 把每个变量当作两个点:A和not A – 对于子式(A or B),添加两条边
• (not A • (not B B) A)
19
1
欧拉路
0011 0010 1010 1101 0001 0100 1011
• 有向图存在欧拉路的条件
– 如果图连通,且每个点的入度等于出度,则 存在欧拉回路。 – 如果图连通,且恰有一点u的出度比入度大 1,另有一点v的出度比入度小1,其余的出 度等于出度,则存在欧拉路,起点为u,终 点为v。 – 对重边、自环适用
0011 0010 1010 1101 0001 0100 1011
• Building Roads (POJ 2749) • FJ有N个牛棚和两个中转站,现在要从每 个牛棚修一条路连接到两个中转站之一 ,并且满足给出的限制条件,限制条件 形式是(i和j必须连到同一个中转站)或者 (i和j不能连到同一个中转站)
1
14
例题分析
0011 0010 1010 1101 0001 0100 1011
• 两个牛棚之间的距离定义为
– 如果两牛棚连到同一个中转站,则距离为两 条路之和 – 如果两牛棚连到不同中转站,则距离为两条 路之和再加上两中转站间的距离
1
• 要求在满足限制条件下,任意两牛棚距 离的最大值最小。
15
• 一个巧妙的实现:DFS一遍,把沿途的边倒
序输出即可
dfs(int k) { for (每条满足e.from == k且未被访问的边e) { 标记e为己访问; dfs(e.to); edge_list[cnt] = e; cnt = cnt + 1; } } 倒序输出edge_list[ ]中的边,即为一条欧拉路 22
1
9
– 边的含义:设存在边(u,v),则如果选择了u ,必须要同时选择v
2-SAT
0011 0010 1010 1101 0001 0100 1011
• 对原图求强连通分量,可知:每个强连 通分量中的所有点必定同时被选择 • But…点A和点not A只能选一个 • 如果某点x和点not x属于同一SCC,必 无解 • 反之?
– 如果图中有边(u,v),则u必定排在v的前面
1
2
拓扑排序
0011 0010 1010 1101 0001 0100 1011
• 典型例子:
– 课程安排(一些课是另一些课的先修课程) – 书本摞放(一本书可能压住下面的某几本书) – 未知数排序(给定一些未知数间的不等式, 求满足这些不等式的一个排序序列)
图算法(2)
——拓扑排序,2-SAT,欧拉/Hamilton路
0011 0010 1010 1101 0001 0100 1011
何亮 roba269@ 2009-02
1
1
拓扑排序
0011 0010 1010 1101 0001 0100 1011
• 有向无环图(Directed Acyclic Graph, DAG) • 图的结点存在一个拓扑序,即满足下面 条件的序列:(序列不一定唯一)
例题分析
0011 0010 1010 1101 0001 0100 1011
• 把每个点看作一个变量,取0和1分别表 示连到两个中转站 • 1)i和j不连到同一个中转站,增加 (Xi OR Xj)和(~Xi OR ~Xj)。 • 2)i和j必须连到同一个中转站,增加(Xi OR ~Xj)和(~Xi OR Xj)。
10
1
2-SAT
0011 0010 1010 1101 0001 0100 1011
• 解的构造:
(1)将原图缩点后得到DAG: G (2)把G图的边反向,得到G’,对G’拓扑排序 (3)选择拓扑序最靠前的未染色点p (4)将p染红色,将与p矛盾的点p’及p’的所有 后代染蓝色 (5)重复第(3)(4)步直至所有点被染色,红色 点即为要选择的点
• Perfect election (TOJ 3122)
– – – – i和j至少有一个被选 (i OR j) i和j至少有一个不被选 (~i OR ~j) i被选或j不被选 (i OR ~j) i不被选或j被选 (~i OR j)
1
13
• Get Luffy Out (POJ 2723)
例题分析
1
29
例题分析
0011 0010 1010 1101 0001 0100 1011
• Ouroboros Snake
– TOJ1070 (此处略有改动) – 题目大意:给定长度k,进制b,求出一个由 [0..b-1]的数组成的环状序列,使得从环上 任一个位置开始的k位数表示一个唯一的b进 制数。(1<=b<=15)
1
例题分析
0011 0010 1010 1101 0001 0100 1011
• 4 1 2 1 4
Sample Input 3 31 33 22 44
• Sample Output 6
1
28
例题分析
0011 0010 1010 1101 0001 0100 1011
– 如果盒子i里面有一张卡片j,就把i,j之间连 一条边,表示至少要有一次从i到j的移动。 容易发现这样建图后每个点的出度必然等于 入度(因为初始时盒子里就有N张卡片,后 面拿出多少张也就要拿入多少张),也就是 说对于每个连通分量,欧拉回路必定存在, 最少的移动次数实际上就是边的总数。 – 在不同的连通分量之间必然要有一次空着手 的移动。因此最后的答案就是 边数+连通分 量数-1(第一次开始时手可以在任何位置) 。
1
11
2-SAT
0011 0010 1010 1101 0001 0100 1011
( x ∨ ¬ y ) ∧ ( ¬x ∨ z ) ∧ ( ¬ y ∨ ¬z )
y0 y1 z0 z1
x0 x1
x0 x1
y0 y1
1
z0 z1
12
例题分析
0011 0010 1010 1101 0001 0100 1011
1
欧拉路
0011 0010 1010 1101 0001 0100 1011
边结束访问的顺序为:
2
(2,1) (4,2) (3,4) (6,3)
1 3 4
(5,6) (3,5) (1,3)
因此找到一条欧拉路: 1→3→5→6→
5 6
1
3→4→2→1
23
例题分析
0011 0010 1010 1101 0001 0100 1011
7
SAT
0011 0010 1010 1101 0001 0100 1011
• 可满足性问题(Satisfiability Problem)
– 给定一布尔表达式,求一个使其为真的解 – 一般的SAT问题是NPC的
• k-SAT k-SAT问题
– 析取范式:(A or B) and (A or not C) and… – 如果每个子式包含的变量数不超过k,则称为k-SAT 问题