二分图

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

图1 二分图举例

图2 非二分图举例

从上面的例子我们可以看到,二分图中的顶点可以分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。
我们可以对两个点集进行 **“染色”**从而进行区分,这也给了我们判断一个图是否为二分图的思路:

  • 遍历图中所有顶点,交替染色,如果在染色的过程中,发现一个顶点v的邻点w颜色与该顶点v相同,那么显然该图不是一个二分图。如果所有顶点都被成功的交替染色,那么最终可以判断原图G是二分图。

染色法代码

算法的代码如下(C++版本):

#define Max 10001
#define white 0 //white表示该顶点还未被遍历到,没有颜色
#define blue 1 //以red和blue作为染色的颜色
#define red 2
#include<iostream>
using namespace std;
int n, m;
int adj[Max][Max]; //邻接表
int color[Max]; //存储顶点颜色的数组
void Init() //初始化邻接矩阵和颜色数组
{for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)adj[i][j] = 0;for (int i = 0; i < n; i++)color[i] = white;
}
bool dyeing_judge(int s,int s_color) //染色法,用DFS对图进行遍历
{color[s] = s_color; //将顶点s先染成指定颜色for (int i = 0; i < n; i++){if (adj[s][i] != 0) { //对于s相邻的每个顶点vif (color[i] == s_color) //如果v已经在之前的遍历染成相同的颜色return false; //说明原图不是二部图,返回falseelse if (color[i] == white) { //如果v没有被染色int c = color[s] == blue ? red : blue; //交替指定颜色return dyeing_judge(i, c); //DFS遍历v}    }}return true; //所有顶点染色成功,返回true
}
int main()
{cin >> n >> m; //输入顶点、边的数量int s, t;Init(); //初始化for (int i = 0; i < m; i++) {//依次输入边cin >> s >> t;adj[s-1][t-1] = 1;adj[t-1][s-1] = 1;}bool judge = dyeing_judge(0, red);//输出判断:是否是二分图if (judge)cout << "yes" << endl;else cout << "no" << endl;
}

测试样例

输入:

3 3
1 2
2 3
1 3

输出:

no

输入:

2 1
1 2

输出:

yes

时间复杂度分析

初始化的复杂度为 O ( n ) O(n) O(n),染色DFS遍历的时间复杂度为 O ( m + n ) O(m+n) O(m+n)。
算法的总时间复杂度为 O ( m + n ) O(m+n) O(m+n)。

染色法判断无向图是否为二部图相关推荐

  1. 图的遍历(染色法判断奇环)

    图的遍历(染色法判断奇环) 传送门 思路:首先图应该为连通图,所需要加的边数即addedge=add_{edge}=addedge​=连通块数−1-1−1 然后又因为是要每次走两步,即最后要走偶数步即 ...

  2. NYOJ1015 二部图(染色法判断二分图)

    描述 二部图又叫二分图,我们不是求它的二分图最大匹配,也不是完美匹配,也不是多重匹配,而是证明一个图是不是二部图.证明二部图可以用着色来解决,即我们可以用两种颜色去涂一个图,使的任意相连的两个顶点颜色 ...

  3. hdu 5285(染色法判断二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5285 解题思路:很明显的是二分图的判定,用染色法即可. 不过这题有一个坑,当n<=1和m=0时要 ...

  4. 二部图(染色法判断二部图)

     二部图 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 二部图又叫二分图,我们不是求它的二分图最大匹配,也不是完美匹配,也不是多重匹配,而是证明一个图是不是二部图. ...

  5. 图论 —— 染色法判断二分图

    二分图定义 二分图,又称二部图,英文名叫 Bipartite graph. 二分图是什么?节点由两个集合组成,且两个集合内部没有边的图.换言之,存在一种方案,将节点划分成满足以上性质的两个集合. 二分 ...

  6. E. Split Into Two Sets(染色法判断二分图)

    Problem - 1702E - Codeforces 波利卡普最近得到了一组n(数字n-偶数)的骨牌.每块多米诺骨牌包含1到n的两个整数. 他能把所有的骨牌分成两组,使每组骨牌上的数字都不一样吗? ...

  7. 二分图(染色法+匈牙利法)学习笔记

    一.二分图模板 二分图的性质: 集合内部没有边 二分图当且仅当图中不含奇数环 1.1. 染色法判断是否为二分图 简要介绍 采用 dfsdfsdfs 遍历图.尝试把和一个点相连的所有的点涂为不同色(一共 ...

  8. 【染色法判别二分图】

    模板题: AcWing 860. 染色法判定二分图 解题思路: (1)判断一个图是否是二分图,判断是否存在奇数环即可,用染色法判断即可. (2)二分图: 是指可以将点集分成两半,每个集合内都没有边,但 ...

  9. AcWing 860. 染色法判定二分图 (染色法)

    题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环. 请你判断这个图是否是二分图. 输入输出格式 : 输入 第一行包含两个整数 n 和 m. 接下来 m ...

最新文章

  1. 无参数的lambda匿名函数
  2. JS大宗师Douglas新书即将开印,就差一个书名了
  3. 关于幂等性的解决方案
  4. HTML5 音频audio 和视频video实用基础教程
  5. 数据库自治服务DAS年度新版本:”数据库自动驾驶“进入规模化时代
  6. 【ARM】Load Store指令
  7. 调用python接口并画图_【PySpark源码解析】教你用Python调用高效Scala接口
  8. 19.TCP/IP 详解卷1 --- TCP 的交互数据流
  9. 自动驾驶路径规划算法学习-RRT算法及matlab实现
  10. 软件测试:测试用例八大要素模板
  11. Github上优秀的开源小程序汇总
  12. 教你如何将 优酷网等视频网站的视频外链时自动播放
  13. 公路通用复化辛普森公式匝道点位坐标计算4800源程序
  14. Bootstrap系列之表单(Forms)
  15. 判断手机号是否是素数
  16. 秀米怎么添加pdf附件「教程」
  17. 微信小程序:去水印工具微信小程序源码
  18. 洛谷1268树的重量(树)
  19. 销售不愿意用企业微信怎么办?
  20. python自动识别简单图片中的文字

热门文章

  1. 计算机网络第一章1-28答案,北邮计算机网络 第一章 课后题答案
  2. 上三角矩阵判定-c++
  3. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie
  4. 三大框架SSH面试题
  5. 加州大学伯克利分校计算机科学专业,加州大学伯克利分校计算机科学专业排名第1(2020年USNEWS美国排名)...
  6. arcgis网络分析最短距离_ArcGIS网络分析(最短路径问题分析)
  7. 大型HashMap评估:JDK、FastUtil、Goldman Sachs、HPPC、Koloboke与Trove
  8. 2021年山东大学python与大数据分析期末试题回忆
  9. 中国服务器芯片龙头股票,4只中国芯片龙头股
  10. 论文解读:GAN与检测网络多任务/SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network