图论杂项问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大密度子图
如上图,要统计的边为点集关联的所有边 除去红色的边
可发现红色的边恰为一个割
Max{|E| - k*|V|} - Min{k*|V| - |E|} |E| = (|V|中点度数之和 – (|V|与|V|的补之割))
/2
最大密度子图
|E| = V中点度数之和 – (V与V的补之割)) / 2 = (∑v∈Vdv – c[V, V’]) / 2
最长路
能否把最短路算法稍做改进,变成求最长 路?
比如把dijkstra里的松弛操作的符号变一下 方向可不可以?
什么特殊情况下可以求?
最长路
无环的情况下可以求 若不要求一定是简单路,则
若图中存在正环(且正环与起止点连通),则 最长路为无穷大
若要求是简单路,此问题为NP难
一个简单的解释:如果此问题有多项式解法, 则Hamilton路有多项式解法
∑ai - k∑bi < 0 ∑ai /∑bi < k
若这个最小总和<0,说明k值假定得大了。 反之说明k小了。于是可以缩小二分的范围, 直至找到恰好等于0的解。[注意精度]
分数规划
最优比率生成树
每边有两权值(a,b),求∑a / ∑b最小的生成树 边权变为a-k*b后求MST,看是否<0
「x点」之间所有的边的权重总和。逐次加入 一个不在A中且w(A, x)最大的x点到A中。 4. 所有点都加入到A集合之后,各点加入的順 序即为所求。
无向图最小割
int map[9][9]; // adjacency matrix int w[9]; // 紀錄各個點到目前的A集合的距離 bool visit[9]; // 紀錄各個點是不是已找過 void maximum_adjacency_search() {
能否把这个总和计入一个割里?
M in {v V (2 k d v ) c [ V ,V '] }
最大密度子图
把原图的无向边变成双向的有向边(注: 此处没有必要拆点),容量为1。添加S,T。 添加从S到每个点的边,容量为0 (why?)。 对每个点添加指向T的边,容量为2k-dv , 求 此网络的最小割。
注意:边权为负怎么办?
最大密度子图
对于此题,处理方法很简单,对每条从S发 出和指向T的边,都增加一个足够大的值U, 使得所有边权非负。此时总的最大流值增 加U*n。
设上述最大流(最小割)为C,则判断 C-U*n的正负情况,即可决定开始猜测的k 是偏大还是偏小。
最大密度子图
凸费用流问题
凸函数:函数的曲线始终在其切线上方 f(y) >= f(x) + f ’(x)(y-x)
随机欧拉图
如果找欧拉路失败,那么是走了一个包含V0的回 路,且除去这个回路上的所有边后,图中仍有边 存在。由欧拉回路的性质易得,剩下的补图中, 每个强连通分量都各自包含一个自己的欧拉回路。
整体算法:首先判断该图是否为欧拉图。如果不 是,直接否定。然后我们试图找一个不包含V0的 回路,如果能找到,那么该图就不是“随机欧拉 图”,因为这时候就存在一种乱走的方案不包含 这个回路。如果找不到,就可以确信原图是"随 机欧拉图"。
if (!visit[t]) w[t] += map[s][t];
} }
无向图最小割
设得到的顺序是x1,x2…xn,则{x1,x2,…xn-1} 与{xn}的割,必定是使得xn-1和xn不在同一 集合里的所有割中最小的
即上面程序里最后一次得到的max 证明略
无向图最小割
“合并”点的操作:
依次为1^2-0^2 = 1, 2^2 – 1^2 = 3, 3^2 – 2^2 =5
凸费用流问题
由费用流的“贪心”性质可知,若某两点 之间有多条边,必然会先填满费用较小的 边。故当此边流过1个流量时,费用为1, 流量为2时,费用为1+3=4,依次类推
思考:为什么要限定“凸”?
平面图最大流
与普通流网络的唯一不同:图是由平面图 构建而来
若把t点并到s点,则对所有x点,有 map[s][x] = map[x][s] = map[s][x] + map[t][x]
若s,t在割的同一侧,合并以后不影响割值
无向图最小割
于是,我们求完此值以后,把xn-1和xn“合 并”成一个点,继续下一次MAS,求得的 就是使得xn-2与{xn-1,xn}不是同一集合中的 最小割
即平面图中的一块区域作为一个点,相邻区域 之间连边所得到的图
有何特殊性质?
平面图最大流
ACM Beijing 2006 如下图所示,边上有权值,要阻断从左上
角到右下角的 的全部路,最 小花费多少 1000*1000矩阵
平面图最大流
T
S
源自文库
平面图最大流
把每个面当作一个点,原问题转变为求S到 T的最短路问题
所谓“合适”是指满足如下限制:
若选择某条边,则必选择其两端点
最大密度子图
以原图的边作为左侧顶点,则原图的点作 为右侧顶点。
左侧点有正权值+1,右侧点有负权值-k 若原图中存在边(u,v),则新图中添加两条
边([uv]u), ([uv]v)
最大权闭合子图!
最大密度子图
新图中点数为m+n,不太理想。能否只用 原图中的点建立网络?
正则二分图的匹配
求一个d=2k-度正则二分图的完美匹配 通常的匹配算法复杂是O(VE),此处可以
更快么?
正则二分图的匹配
因为d为偶数,我们一定可以用O(E)时间在 d-正则二分图中找出一个欧拉回路。然后, 我们把这条欧拉回路中的边隔一条删掉一 条,因为对每个点来说每一对入边和出边 都恰好留下一条,你会发现得到了一个 (d/2)-正则二分图。重复上面算法直到d=1, 则完美匹配显然可得。而我们会惊奇地发 现E + E/2 + E/4 + … = 2E,所以总的复杂 度还是O(E)。
例如 y = x^2 (x>0)
凸费用流问题是指,费用与流量成凸函数 关系(而不是经典的线性关系)
凸费用流问题
因为流量常限定为整数,故费用函数可看 作“分段”为凸。类似下图所示:
凸费用流问题
一个实用解法:拆边
根据费用函数的“折点”把边拆成费用不 同的若干条边。
例如:某边容量上限为3,费用为f(x)=x^2 则可把该边拆成3条边,容量均为1,费用
if (!visit[i] && w[i] > max) max = w[i], s = i;
visit[s] = true; // 加入s點到A集合 cout << "這次讀到第" << s << "點" << endl; // 加入s點到A集合後,更新w(A, x)的值。 for (int t=0; t<V; ++t)
重复此过程直到缩为1个点,比较每次求得 的割的最小值即可
MAS: O(n^2) 共做n次
正则二分图
正则二分图是指,所有点的度都为同一个 值的二分图
Hall定理:二分图G有完美匹配,当且仅当 G满足Hall条件:对X集的任意子集S都有 |S|<=|N(S)|,N(S)表示S中的点在Y集中的相 邻点组成的集合。
最小平均环路
每边有两权值(a,b),在图中找一个环,使得环 上所有的∑a / ∑b最小
边权变成a-k*b后,Bellman-ford (SPFA)找负环
最大密度子图
回到原题,密度定义 |E| / |V| = k
假设答案为k,则要求解的问题是:选出一 个合适的点集V和边集E,令(|E| - k * |V|)取 得最大值
Havel定理
给定一个非负整数序列{d1,d2,...dn},若存在一个 无向图使得图中各点的度与此序列一一对应,则 称此序列可图化。进一步,若图为简单图,则称 此序列可简单图化。
可图化的判定比较简单:d1+d2+...dn=0(mod2)。 关于具体图的构造,我们可以简单地把奇数度的 点配对,剩下的全部搞成自环。
Havel定理
Havel定理:我们把序列排成不增序,即 d1>=d2>=...>=dn,则d可简单图化当且仅当 d‘=(d2-1, d3-1, ... d(d1+1)-1, d(d1+2), d(d1+3), ... dn)可简单图化。
实际上也就是,我们把d排序以后,找出度 最大的点(设度为d1),把它和度次大的d1 个点之间连边,然后这个点就可以不管了, 一直继续这个过程,直到建出完整的图, 或出现负度等明显不合理的情况。
正则二分图
推论1:正则二分图必有完美匹配
证明:设正则二分图所有点的度为k,则任意 一个左侧点集的子集X关联|X|*k条边,这|X|*k 条边至少关联右侧|X|个点(由鸽笼原理), 故满足Hall定理的条件
正则二分图
推论2:k-正则二分图有k个边不重叠的完 美匹配
证明:由推论1,k-正则二分图必有完美匹配, 把这个完美匹配去掉以后,变成k-1度的正则 二分图,仍存在完美匹配。依此类推。
M in { k |V | |E |} M in { k 1 v V d v c [ V ,V '] }
v V
2
为便于计算,扩大2倍,化简得
M in {v V (2 k d v ) c [ V ,V '] }
最大密度子图
选出一个点集V,里面每选一个点v的花费是2kdv,这部分花费再加上V和它的补集之前的割, 要求总和最小
无向图最小割
与普通最小割不同之处:不限定源与汇, 随便割成两部分即可
枚举?
可以比O(n^2)次最大流更快么?
无向图最小割
只需O(n)次最大流,但我们可以更快……
Stoer-Wagner算法 O(n^3)
无向图最小割
Maximum Adjacency Search
1. 建立一个空的A集合。 2. 首先随便在图上找一点,加入到A集合中。 3. 令w(A, x)是「目前的A集合的每个点」与
随机欧拉图
随机欧拉图是指,从某个指定点V0开始, 任意地走不重复的边,不论如何走都会走 出一条欧拉回路。
如何判断一个图是否随机欧拉图?
随机欧拉图
首先,如果图不满足欧拉回路存在的性质则肯定 不是,下面讨论原图已经是欧拉图的情况。
如果随机走的时候失败,说明一定是走到了某一 点v,由此点出发的所有边都已经被走过了。容 易发现,如果失败的话,最后停的点一定是出发 的原点V0。因为如果是停在其它点,那么此点的 入度一定比出度大一,但这与前提“图中存在欧 拉回路”矛盾。
图论杂项问题
最大闭合子图
闭合子图(closure)是指,若X在该集合中, 则X的后继结点也必须在该集合中
给定任意有向图,点上有权值(可正可 负),求出权值总和最大的闭合子图。
最大密度子图
给定一个无向图,要求它的一个子图(点 集和边集都是原图的子集),使得子图中 边数与点数的比值最大。
最大密度子图
for (int i=0; i<9; i++) visit[i] = false; // initialize for (int i=0; i<9; i++) w[i] = 0; for (int i=0; i<V; ++i) {
// 找出一個尚未加入A當中、且w(A, x)最大的x點。 int s = 0, max = -1e9; for (int j=0; j<V; ++j)
图论中的NPC / NP-Hard问题
Hamilton回路 旅行售货员问题 最大团 最小点覆盖集 最大独立集
在二分图中上两个问题都可解
图论中的NPC / NP-Hard问题
子图同构问题 最大割 着色数 最小支配集
即使在二分图中仍然难解
涉及比值的问题常见思路——二分答案
所谓0-1分数规划问题
E.g. 最优比率生成树,最小平均环路
模型:给定N对数(ai,bi),要求从中选出一 部分来,使得∑a / ∑b最小
分数规划
由每对(ai,bi),我们求得一系列新值 ai – k * bi。现在的问题中,从中找出若干个新值, 使得其总和∑(ai-k*bi)最小(这是一个很简 单的问题),也就是∑ai - k∑bi最小。