无向图G=(V,E)的二分图判断
二分图的概念
无向图G=(V,E)G=(V,E)G=(V,E)的顶点集VVV可分为两个集合V1V_1V1,V2V_2V2,s.t.∀(u,v)∈E,∃u∈V1,v∈V2\: s.t. \: \forall (u,v) \in E, \: \exists \: u\in V_1,v \in V_2s.t.∀(u,v)∈E,∃u∈V1,v∈V2 或u∈V2,v∈V1u\in V_2,v \in V_1u∈V2,v∈V1,则称图GGG为二分图,即所有的边都位于V1V_1V1和V2V_2V2之间。
判断方法
判断二分图的常用方法为染色法。通过遍历整个无向图GGG,对图中的顶点进行有规律的染色。
染色步骤为:选择一个起始顶点uuu,将其染成黑色BLACKBLACKBLACK;然后遍历所有与uuu相邻的顶点vvv,将vvv染成白色WHITEWHITEWHITE;同时再将与顶点vvv相邻的顶点www,将www染成黑色BLACKBLACKBLACK;依次进行下去,直到遍历结束。
若图中还有顶点未遍历,则重复上述染色步骤。
如果我们能够完成染色步骤,那么该无向图为二分图。
如果染色过程中产生了冲突,即当遍历到某个顶点xxx时,该顶点已经染色,并且xxx的颜色与我们准备给其染成的颜色不一致,则表示该无向图不是二分图。
判断二分图的过程
可以使用深度优先搜索或广度优先搜索对无向图进行遍历。
考虑到无向图可能是一个非连通图,因此需要多次执行广度优先搜索或深度优先搜索才能完全遍历所有的顶点。
BFS Pseudocode
G=(V,E)G=(V,E)G=(V,E)
∀\forall∀ 顶点u∈Vu\in Vu∈V,定义visited[u]visited[u]visited[u]存储搜索过程中顶点uuu的染色情况:
UNVISITEDUNVISITEDUNVISITED:未访问状态。
WHITEWHITEWHITE:标记为白色。
BLACKBLACKBLACK:标记为黑色。
定义First-in, first-out (FIFO)队列QQQ,存放搜索中的顶点。
BFS-Pseudocode(G)// 初始化顶点的颜色for every u in V[G]visited[u] = UNVISITED//初始化队列Q = nil// 遍历无向图的全部顶点,进行染色for every u in V[G]if visited[u] == UNVISITED thenresult = BFS(u)do if result == false thenreturn falsereturn true
BFS(u)// 开始搜索时设置源顶点u的颜色为BLACK,并放入队列中Q.push(u)visited[u] = BLACK// Q队列存放搜索中的顶点;该顶点已被染色,但其邻接表的顶点还尚未被染色while Q is not emptydo u = Q.pop()for v in Adj[u] // 顶点u的邻接表do if visited[v] == UNVISITED then // 对未访问的顶点染成与u相反的颜色visited[v] = visited[u] == WHITE ? BLACK: WHITEQ.push(v)else if visited[u] == visited[v] then // 染色过程中产生了冲突return false // 不是二分图else thentrivialreturn true
DFS Pseudocode
DFS-Pseudocode(G)// 初始化顶点的颜色for every u in V[G]visited[u] = UNVISITED// 判断结果result = true// 遍历无向图的全部顶点,进行染色for every u in V[G]if visited[u] == UNVISITED thenDFS(u, BLACK)do if result == false thenreturn falsereturn true
DFS(u, color)// 顶点u的染色为colorvisited[u] = colorfor v in Adj[u] // 顶点u的邻接表do if visited[v] == UNVISITED then// 对未访问的顶点染成与u相反的颜色reverseColor = color == WHITE ? BLACK: WHITEDFS(v, reverseColor)do if result == flase then // 深度遍历过程中,提前判断,提前结束returnelse if color == visited[v] then // 染色过程中产生了冲突result = false // 不是二分图returnelse thentrivial
无向图G=(V,E)的二分图判断相关推荐
- 如果图G=V,E是哈密尔顿图,则它必然具备下述性质
哥尼斯堡七桥问题是在寻找一条遍历图中所有边的简单路径,而哈密尔顿的周游世界问题则是在寻找一条遍历图中所有点的基本路径.在无向图G=<V,E>中,遍历G中每个顶点一次且仅一次的路径称为哈密尔 ...
- 二分图判断(交叉染色)
二分图又称二部图. 二分图是无向图. 设G=(V,E)是一个无向图.如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集. 例如这就是一个二分图. 大概就是把顶点分成 ...
- 二分图判断以及二分图最大匹配
概念 二分图又称作二部图 ,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的 ...
- 【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
应用一 设计算法以求解无向图G的连通分量的个数 图示: 深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=fi ...
- HDU 5971 2016ICPC大连 A: Wrestling Match(二分图判断)
题意:这题难在题意.. 因为题面太尴尬了所以直接转了吧,据说很多写法都能过 有n个点m条边的图,已知有x个点是黄色的,y个点是红色的(最后的x+y行输入的是这些点的编号) 问是否能将这个图转化成二分图 ...
- 有向图 G=(V, E) 的拓扑排序
有向图 G=(V,E)G=(V,E)G=(V,E) 的拓扑排序 拓扑排序概念 拓扑排序是针对有向图而言的,无向图中不存在拓扑排序的概念.所谓拓扑排序,即为有向图中全部顶点的一种线性排序.这个线性排序结 ...
- 图的建立、遍历及其应用(设图结点的元素类型为char,建立一个不少于8个顶点的带权无向图G,实现以下图的各种基本操作的程序)
实验目的:通过实验达到: ⑴ 理解和掌握图的基本概念.基本逻辑结构: ⑵ 理解和掌握图的邻接矩阵存储结构.邻接链表存储结构: ⑶ 理解和掌握图的DFS.BFS遍历操作的思想及其实现: ⑷ 加深对堆栈. ...
- 无向图g的邻接矩阵一定是_矩阵是图
无向图g的邻接矩阵一定是 To study structure,tear away all flesh soonly the bone shows. 要研究结构,请尽快撕掉骨头上所有的肉. Linea ...
- 设无向图g如图所示_阿里重磅发布大规模图神经网络平台 AliGraph,架构算法解读...
图神经网络 (GNN) 主要是利用神经网络处理复杂的图数据,它将图数据转换到低维空间,同时最大限度保留结构和属性信息,并构造一个用于训练和推理的神经网络.在实际应用中,为了加速 GNN 训练和新算法的 ...
最新文章
- 前阿里 P9 级员工称离婚是模拟测试,已回滚复婚!
- Oracle中事务锁(锁住的表、锁住的会话)
- gevent-tutorial翻译和解读
- Raphael JS 矢量客户端开源框架
- PHP stomp 连接判断,php实现通过stomp协议连接ActiveMQ操作示例
- 通过Cookie存取用户游览记录的代码示例
- BookCorpus数据集爬虫
- Python反射和内置方法(双下方法)
- 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
- 20172304 《程序设计与数据结构》 第一周学习总结
- 跨实例查询 mysql_SQL语句怎么搞定跨实例查询?
- 电信光猫 远程服务器,如何禁止电信远程控制服务器修改光猫配置信息
- 2019 live tex 发行版_TexLive 2019 安装指南
- win7关闭休眠_你的Windows7系统运行缓慢?给你一个Win7系统减肥攻略
- Unity粒子系统基础总结
- HackBrowserData密码抓取
- VB顺序文件案例:简易文本编辑器
- 学习嵌入式,买什么样的开发板?
- 关于科研技术的一些常用网址
- Windows 7镜像安装Windows Tools 及一点常见问题(系统需要升级SP1)