图论中一类问题的总结 :必须边(点) 可行边(点)

很多图论问题之所以复杂 是因为这个模型本身是不唯一的,举个例子,一个二分图的最大匹配可能有很多个,而一个无向图的MST(最小生成树)也可能有不同的形态,这就导致了这样一类问题的诞生:1.某条边(或点)是否是满足这个模型的前提下必须存在的 2.可不可能使得这条边存在的前提下满足这个模型

当然这个问题还可以延伸出许多变种,例如所有边都是必须边,那么这个模型唯一

1.无向图固定起点S和终点T,某条边是否能够成为S-T最短路上的一条边?

这个问题比较容易,对S和T 分别做一次SSSP(单源最短路),到各个点的最短路分别记为distS[]和distT[],那某条边x-y,边权为w 能成为最短路的条件显然是distS[x]+w+distT[y]==distS[T]

2.某条边能否成为无向图MST上的可行边?

结论:某条边e能成为MST上的一条边的充要条件是在图中不存在一个环使得e为环上权值最大的边

证明:

引1:MST的回路性质:不妨设图中所有边权各不相同,C为图G上任意回路,边e为C上权值最大的边,则图G上的MST 不包含e

该命题很显然,利用反证法即可证明

充分性:由回路性质直接可以得到不存在一个环使得e为环上权值最大的边

必要性:

假设存在不包含e的MST为T,我们在T中加入一条边e则会形成一个回路,由于不存在一个回路使得e为最大值,所以我们删去回路上的最大值的边,此时仍然是树的结构设为T‘  且T‘包含边e,w(T)<w(T’) 和T是MST矛盾 QED.

相关问题:BZOJ2561

3.某个点是否是二分图最大匹配的必须点?

算法:这个算法比较多,介绍一种比较好理解的

先跑一边二分图的最大匹配,然后在原有匹配的基础上,我们依次把X部对应Y部匹配的点标记,然后对X部的这个点再次增广,如果能够增广,显然标记的这个点不是必须点

时间复杂度O(2VE)也就是跑两次匈牙利的时间

附:同理,判断某条边是否是必须边也可用此法

4.二分图最大匹配的所有可行边

算法:跑一遍二分图的最大匹配构造初始匹配,然后把初始匹配的匹配边看成点,向原来X部指向Y部的边建边,然后跑一次强连通即可(貌似不太容易说明白,另一种建图方式是把初始最大匹配的边反向建边,其它边不变 然后跑强连通)

某条边是二分图匹配的可行边当且仅当这条边的两个顶点所在的强连通分量相同

to be continue

时间: 2024-11-10 16:09:04

图论中一类问题的总结 :必须边(点) 可行边(点)的相关文章

算法7-6:图论中的难题

二部图 难度:★★ 二分图是图论中的一种特殊模型,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图. 下图是一个二分图的例子,红点之间不会相邻,白点之间不会相邻. 判断图中是否存在环 难度:★★ 通过深搜就可以解决了. 欧拉环 难度:★★ 从一个顶点出发,所有的边都只经过一次,最后回到起点.判断一张图中是否存在这样的路径. 哈密尔顿环 难度:★★★★ 从一个顶点出发,所有的顶点都经过一次,最后回到起点.判断一张图中是否存在这样的路径. 这个是一个经典的NP完全问题,目前

图论中的一些名词的定义。

最近zkx大佬在学图论,有一些定义很秀,压根读不懂,所以按照自己的理解来总结一下. 顶点集合 顶点集合:是原图中 点 的集合. 割点集合 割点集合:是个 顶点集合,在原 连通图 中删去 集合中的所有的点 和 与集合中的点相连的边 后,原 连通图 不再连通. 点连通度 点连通度:最小 的 割点集合 的大小(最小的割点集合中的点的个数). 割边集合 割边集合:是个 边 的集合,在原 连通图 中删去 集合中所有的边 后,原 连通图 不再连通. 边连通度 边连通度:最小 的 割边集合 的大小(最小的割边

Prim算法和Kruskal算法(图论中的最小生成树算法)

最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中权值最小的那个边一定在最小生成树中,如果一个图包含环,环中权值最大的边一定不在最小生成树中,还有就是连接图的任意两个划分的边中权值最短的那一条一定在最小生成树中. 下面介绍两个算法. Prim算法 Prim算法就是以任意一个点为源点,将所有点分为两组,一组是已经在最小生成树上的点,另一组是还未在最小

图论中的sb错误集锦

1.floyd--jzyzoj1213 最优乘车 策略非常简单,就是建立权值为1的边就好了,然而处理数据的时候翻了个sb错误: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 #define MAX 510 7 int m,n,a[510][510],queue[51000]; 8 string s[

图论中四个最短路径算法

(一)单源最短路径算法 1. Dijksta算法 要求图G(V,E)的所有边的权重都为非负值. 运用了贪心算法的思想,但是较好地的是,其找到的解一定是最优解. 算法主要思想: 用数组d[]表示开始节点A到其余节点的路径长度:用w(u,v)表示节点u到v的权值,若两节点无直接路径,则该值为无穷大:矩阵Q保存每次循环每个节点的dv]值,总结点数为n. 初始时,开始节点到自身距离d[A]初值为0,到其余节点d[V]初值为无穷大. 循环:对每个节点进行判断,若d[v]大于d[u]+w(u,v),则令d[

【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情况下,我们把图看成是一种由"顶点"和"边"组成的抽象网络.在各个"顶点"间可以由"边"连接起来,使两个顶点间相互关联起来.图的结构可以描述多种复杂的数据对象,

疯子的算法总结(九) 图论中的矩阵应用 Part 1+POJ3613 Cow Relays

图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M—>N的距离,若经过一次松弛操作demo[M][N]=demo[M][K]+demo[K][N],即为demo[M][N]经过了两条条边的最小距离,floyd是 demo[M][N]=Min(demo[M][K]+demo[K][N],demo[M][N]),有可能两点之间直接距离最短,不经过第三边,那我们不考虑不经过两点之间的情况,那么demo[M][N]等于  demo[M

图论中TSP问题的LINGO求解与应用

巡回旅行商问题(Traveling Salesman Problem,TSP),也称为货郎担问题.该问题可简单描述为走遍n个城市的最短路.几十年来,出现了很多近似优化算法.如近邻法.贪心算法.最近插入法.最远插入法.模拟退火算法以及遗传算法. 问题1 设有一个售货员从10个城市中的某一个城市的出发,去其他9个城市推销产品.10个城市的距离已经给出.10个城市相互距离如下表.要求每个城市到达一次仅以此后,回到原出发城市.问:他如何选择旅行路线,使总路程最短. model: sets: city/1

HDOJ5441(图论中的并查集)

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAX_N=100005; const int MAX_V=20005; const int MAX_Q=5005; struct edge{ int from,to,cost; }es[MAX_N]; int V,E,Q; bool comp(const edge &e1,const edg