当前位置:文档之家› 图论杂项问题

图论杂项问题


随机欧拉图
随机欧拉图是指,从某个指定点V0开始, 任意地走不重复的边,不论如何走都会走 出一条欧拉回路。
如何判断一个图是否随机欧拉图?
随机欧拉图
首先,如果图不满足欧拉回路存在的性质则肯定 不是,下面讨论原图已经是欧拉图的情况。
如果随机走的时候失败,说明一定是走到了某一 点v,由此点出发的所有边都已经被走过了。容 易发现,如果失败的话,最后停的点一定是出发 的原点V0。因为如果是停在其它点,那么此点的 入度一定比出度大一,但这与前提“图中存在欧 拉回路”矛盾。
例如 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)
即平面图中的一块区域作为一个点,相邻区域 之间连边所得到的图
有何特殊性质?
平面图最大流
ACM Beijing 2006 如下图所示,边上有权值,要阻断从左上
角到右下角的 的全部路,最 小花费多少 1000*1000矩阵
平面图最大流
T
S
平面图最大流
把每个面当作一个点,原问题转变为求S到 T的最短路问题
∑ai - k∑bi < 0 ∑ai /∑bi < k
若这个最小总和<0,说明k值假定得大了。 反之说明k小了。于是可以缩小二分的范围, 直至找到恰好等于0的解。[注意精度]
分数规划
最优比率生成树
每边有两权值(a,b),求∑a / ∑b最小的生成树 边权变为a-k*b后求MST,看是否<0
最长路
能否把最短路算法稍做改进,变成求最长 路?
比如把dijkstra里的松弛操作的符号变一下 方向可不可以?
什么特殊情况下可以求?
最长路
无环的情况下可以求 若不要求一定是简单路,则
若图中存在正环(且正环与起止点连通),则 最长路为无穷大
若要求是简单路,此问题为NP难
一个简单的解释:如果此问题有多项式解法, 则Hamilton路有多项式解法
所谓“合适”是指满足如下限制:
若选择某条边,则必选择其两端点
最大密度子图
以原图的边作为左侧顶点,则原图的点作 为右侧顶点。
左侧点有正权值+1,右侧点有负权值-k 若原图中存在边(u,v),则新图中添加两条
边([uv]u), ([uv]v)
最大权闭合子图!
最大密度子图
新图中点数为m+n,不太理想。能否只用 原图中的点建立网络?
图论杂项问题
最大闭合子图
闭合子图(closure)是指,若X在该集合中, 则X的后继结点也必须在该集合中
给定任意有向图,点上有权值(可正可 负),求出权值总和最大的闭合子图。
最大密度子图
给定一个无向图,要求它的一个子图(点 集和边集都是原图的子集),使得子图中 边数与点数的比值最大。
最大密度子图
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集合的每个点」与
若把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}不是同一集合中的 最小割
依次为1^2-0^2 = 1, 2^2 – 1^2 = 3, 3^2 – 2^2 =5
凸费用流问题
由费用流的“贪心”性质可知,若某两点 之间有多条边,必然会先填满费用较小的 边。故当此边流过1个流量时,费用为1, 流量为2时,费用为1+3=4,依次类推
思考:为什么要限定“凸”?
平面图最大流
与普通流网络的唯一不同:图是由平面图 构建而来
if (!visit[t]) w[t] += map[s][t];
} }
无向图最小割
设得到的顺序是x1,x2…xn,则{x1,x2,…xn-1} 与{xn}的割,必定是使得xn-1和xn不在同一 集合里的所有割中最小的
即上面程序里最后一次得到的max 证明略
无向图最小割
“合并”点的操作:
正则二分图
推论1:正则二分图必有完美匹配
证明:设正则二分图所有点的度为k,则任意 一个左侧点集的子集X关联|X|*k条边,这|X|*k 条边至少关联右侧|X|个点(由鸽笼原理), 故满足Hall定理的条件
正则二分图
推论2:k-正则二分图有k个边不重叠的完 美匹配
证明:由推论1,k-正则二分图必有完美匹配, 把这个完美匹配去掉以后,变成k-1度的正则 二分图,仍存在完美匹配。依此类推。
正则二分图的匹配
求一个d=2k-度正则二分图的完美匹配 通常的匹配算法复杂是O(VE),此处可以
更快么?
正则二分图的匹配
因为d为偶数,我们一定可以用O(E)时间在 d-正则二分图中找出一个欧拉回路。然后, 我们把这条欧拉回路中的边隔一条删掉一 条,因为对每个点来说每一对入边和出边 都恰好留下一条,你会发现得到了一个 (d/2)-正则二分图。重复上面算法直到d=1, 则完美匹配显然可得。而我们会惊奇地发 现E + E/2 + E/4 + … = 2E,所以总的复杂 度还是O(E)。
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 个点之间连边,然后这个点就可以不管了, 一直继续这个过程,直到建出完整的图, 或出现负度等明显不合理的情况。
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问题
子图同构问题 最大割 着色数 最小支配集
即使在二分图中仍然难解
Havel定理
给定一个非负整数序列{d1,d2,...dn},若存在一个 无向图使得图中各点的度与此序列一一对应,则 称此序列可图化。进一步,若图为简单图,则称 此序列可简单图化。
可图化的判定比较简单:d1+d2+...dn=0(mod2)。 关于具体图的构造,我们可以简单地把奇数度的 点配对,剩下的全部搞成自环。
最小平均环路
每边有两权值(a,b),在图中找一个环,使得环 上所有的∑a / ∑b最小
边权变成a-k*b后,Bellman-ford (SPFA)找负环
最大密度子图
回到原题,密度定义 |E| / |V| = k
假设答案为k,则要求解的问题是:选出一 个合适的点集V和边集E,令(|E| - k * |V|)取 得最大值
「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() {
注意:边权为负怎么办?
最大密度子图
对于此题,处理方法很简单,对每条从S发 出和指向T的边,都增加一个足够大的值U, 使得所有边权非负。此时总的最大流值增 加U*n。
相关主题