题意:给一张图,判断是不是二分图;

自己一开始不知道是二分图染色,理解的是任意三点不能互相连接

可能以后遇到这样的模型,可以往二分图想;

首先怎么判定一个图是否为二分图

从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图;

每次用bfs遍历即可;

下面这个算是模板:解释的比较详细。

  1. #include <queue>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. const int N = ;
  7. int col[N], Map[N][N];
  8.  
  9. //0为白色,1为黑色
  10. bool BFS(int s, int n)
  11. {
  12. queue<int> p;
  13. p.push(s);
  14. col[s] = ; //将搜索起始点涂成黑色
  15. while(!p.empty())
  16. {
  17. int from = p.front();
  18. p.pop();
  19. for(int i = ; i <= n; i++)
  20. {
  21. if(Map[from][i] && col[i] == -) //如果从from到i的边存在(为邻接点) && i点未着色
  22. {
  23. p.push(i); //将i点加入队列
  24. col[i] = !col[from];//将i点染成不同的颜色
  25. }
  26. if(Map[from][i] && col[from] == col[i])//如果从from到i的边存在(为邻接点)
  27. return false;           //并且 i点和from点这一对邻接点颜色相同,
  28. } // 则不是二分图
  29. }
  30. return true; //搜索完s点和所有点的关系,并将邻接点着色,且邻接点未发现相同色则返回true
  31. }
  32.  
  33. int main()
  34. {
  35. int n, m, a, b;
  36. memset(col, -, sizeof(col));
  37. cin >> n >> m; //n 为有多少点,m为有多少边
  38. for(int i = ; i < m; i++)
  39. {
  40. cin >> a >> b;
  41. Map[a][b] = Map[b][a] = ;
  42. }
  43. bool flag = false;
  44. for(i = ; i <= n; i++) //遍历并搜索各个连通分支
  45. {
  46. if(col[i] == - && !BFS(i, n)) //每次找没有着色的点进行判断,如果从它开始BFS发现相同色邻接点则不是二分图
  47. {
  48. flag = true;
  49. break;
  50. }
  51. }
  52. if(flag)
  53. cout << "NO" <<endl;
  54. else
  55. cout << "YES" <<endl;
  56. return ;
  57. }

自己的本题ac代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6.  
  7. using namespace std;
  8. int n,m,book[],mp[][];
  9. void init(){
  10. memset(book,-,sizeof(book));
  11. memset(mp,,sizeof(mp));
  12. }
  13. bool bfs(int s)
  14. {
  15. queue <int> q;
  16. q.push(s);
  17. book[s]=;
  18. while(!q.empty())
  19. {
  20. int from = q.front();
  21. q.pop();
  22. for(int i=;i<n;i++)
  23. {
  24. if(mp[from][i]&&book[i]==-)
  25. {
  26. q.push(i);
  27. book[i] = !book[from];
  28. }
  29. if(mp[from][i]&&book[i]==book[from])
  30. {
  31. return false;
  32. }
  33. }
  34. }
  35. return true;
  36. }
  37. int main(){
  38. while(~scanf("%d",&n),n){
  39. scanf("%d",&m);
  40. init();
  41. for(int i=;i<=m;i++)
  42. {
  43. int x,y;
  44. scanf("%d%d",&x,&y);
  45. mp[x][y]=;
  46. mp[y][x]=;
  47. }
  48. bool flag = true;
  49. for(int i=;i<n;i++)
  50. {
  51. if(book[i]==-&&!bfs(i))
  52. {
  53. flag=false;
  54. break;
  55. }
  56. }
  57. if(flag)puts("BICOLORABLE.");
  58. else puts("NOT BICOLORABLE.");
  59. }
  60. return ;
  61. }

UVA-10004-Bicoloring二分图染色的更多相关文章

  1. UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

    d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...

  2. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)

    Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...

  3. UVA 10004 Bicoloring(DFS染色)

    题意: 给N个点构成的无环无向图,并且保证所有点对都是连通的. 给每个点染色,要么染成黑要么染成白.问是否存在染色方案使得所有有边相连的点对颜色一定不一样. 是输出 BICOLORABLE 否则输出 ...

  4. UVA 10004 Bicoloring

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&pa ...

  5. Bicoloring 二分图+染色

    https://vjudge.net/contest/281085?tdsourcetag=s_pcqq_aiomsg#problem/B #include<stdio.h> #inclu ...

  6. Bicoloring UVA - 10004 二分图判断

    \(\color{#0066ff}{题目描述}\) 多组数据,n=0结束,每次一个n,m,之后是边,问你是不是二分图 \(\color{#0066ff}{输入样例}\) 3 3 0 1 1 2 2 0 ...

  7. UVA - 11396 Claw Decomposition(二分图染色)

    题目大意:给你一张无向图,每一个点的度数都是3. 你的任务是推断是否能把它分解成若干个爪(每条边仅仅能属于一个爪) 解题思路:二分图染色裸题.能够得出:爪的中心点和旁边的三个点的颜色是不一样的 #in ...

  8. LA 3523 圆桌骑士(二分图染色+点双连通分量)

    https://vjudge.net/problem/UVALive-3523 题意: 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置 ...

  9. 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)

    layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...

  10. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

随机推荐

  1. poj 1068 模拟

    题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...

  2. Spring的依赖注入和管理Bean

    采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...

  3. TensorFlow学习笔记——深层神经网络的整理

    维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”.因为深层神经网络是实现“多层非线性变换”最常用的一种方法,所以在实际中可以认为深度学习就是深度神经网络的代名词.从 ...

  4. 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示

    手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...

  5. Activiti6系列(1)- 核心数据库表及字段注释说明

    前言 本文是根据<疯狂工作流讲义-Activiti6.0>一书中提取过来的,有兴趣的可以去当当网买这本书,讲的很不错,最后还有实战案例. 虽然是提取过来的,但完全靠手打梳理,觉得有用的小伙 ...

  6. 《HTTP权威指南》--阅读笔记(一)

    HTTP: HyperText Transfer Protocol 测试站点:http://www.joes-hardware.com URI包括URL和URN URI: Uniform Resour ...

  7. hadoop学习(六)----HDFS的shell操作

    HDFS所有命令: [uploaduser@rickiyang ~]$ hadoop fs Usage: hadoop fs [generic options] [-appendToFile < ...

  8. JQGrid之文件上传

    文件/图片上传功能,简单总结如下 1.引入ajaxfileupload.js 注意:该文件需要在引入Jquery之后引入 下载链接:https://i.cnblogs.com/Files.aspx 2 ...

  9. 【程序人生】从湖北省最早的四位java高级工程师之一到出家为僧所引发的深思

           从我刚上大学接触程序员这个职业开始,到如今我从事了七年多程序员,这期间我和我的不少小伙伴接受了太多的负面信息,在成长的道路上也真了交了不少的情商税.这些负面信息中,有一件就是我大学班主任 ...

  10. html页面中关于按钮type的要求

    重要事项:如果在 HTML 表单中使用 button 元素,不同的浏览器会提交不同的值.Internet Explorer 将提交 <button> 与 </button> 之 ...