染色法判定二分图

思路:相邻的点染不同颜色 看能不能染完 如果过程中出现相邻点相同颜色,就不可以

注意:需要遍历n个点 看此点是否被染色过 如果没有就进行一次dfs或bfs

二分图:可以把点分成两个集合,使得边只在两集合之间,集合内部没有边

一个树是二分图当且仅当图中不含奇数环

由于图中没有奇数环,所以染色过程一定没有矛盾
这题由于是无向图 边数应该是2N 第一次没注意到 导致一直超时

#include<bits/stdc++.h>using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],idx;
int n,m;
int col[N];
bool st[N];void add(int x,int y)
{e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}void dfs(int k)
{for(int i=h[k];i!=-1;i=ne[i]){int j=e[i];if(col[j]==col[k]) {puts("No");//printf("%d %d\n",k,j);exit(0);}if(col[j]==0){if(col[k]==1) col[j]=2,dfs(j);else col[j]=1,dfs(j);}}//return 1;
}void bfs(int k)
{queue<int> q;q.push(k);while(q.size()){int t=q.front();q.pop();for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(col[j]==col[t]){puts("No");exit(0);}if(col[j]) continue;if(col[t]==1) col[j]=2,q.push(j);else col[j]=1,q.push(j);}}
}int main()
{memset(h,-1,sizeof h);scanf("%d%d",&n,&m);while(m--){int x,y;scanf("%d%d",&x,&y);add(x,y),add(y,x);}for(int i=1;i<=n;i++){if(col[i]==0) {//printf("i=%d\n",i);col[i]=1;dfs(i);//bfs(i);}}//for(int i=1;i<=n;i++) printf("%d ",col[i]);puts("");puts("Yes");
}

匈牙利算法

二分图最大匹配:二分图两部分最大的1v1的边的数量

注意st[N]的含义 是为了让前辈换匹配的时候 不会再次选到这一点

#include<bits/stdc++.h>using namespace std;
const int N=1e5+10;
int h[N],e[N],ne[N],idx;
int n1,n2,m;
int match[N];
bool st[N];
int a[N];void add(int x,int y)
{e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}bool find(int k)
{for(int i=h[k];i!=-1;i=ne[i]){int j=e[i];if(!st[j]){st[j]=1;//是为了防止前面的又选择了这个点if(match[j]==0||find(match[j])) {match[j]=k;return 1;}//st[j]=0;如果 前面没有匹配成功  说明j的左边除了j没有更好的其余的选择 //所以后面的也就不要考虑j了  这里加上就超时了}}return 0;
}int main()
{memset(h,-1,sizeof h);scanf("%d%d%d",&n1,&n2,&m);while(m--){int x,y;scanf("%d%d",&x,&y);a[x]=1;add(x,y);}int ans=0;for(int i=1;i<=n1+n2;i++){if(!a[i]) continue;memset(st,0,sizeof st);if(find(i)) ans++;}printf("%d",ans);
}

染色法判定二分图 匈牙利算法相关推荐

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

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

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

    题目连接 https://www.acwing.com/problem/content/862/ 思路 我们对每一个节点进行染色操作,我们需要注意的是我们染色后要将当前节点的所有相邻节点全部染成另一种 ...

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

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

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

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

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

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

  6. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

  7. 图论 —— 二分图 —— 匈牙利算法

    [基本概念] 1.交替路 从一个未匹配点出发,依次经过 非匹配边.匹配边.非匹配边- 形成的路径 2.增广路 定义:设 M 为二分图 G 已匹配边的集合,若 P 是图 G 中一条连通两个未匹配点的路径 ...

  8. [SinGuLaRiTy] 二分图匈牙利算法

    [SinGuLaRiTY-1019] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二分图 二分图是图论中一种特殊的图形.顾名思义,二分图G ...

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

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

最新文章

  1. js获取已知scripts中是否存在某变量_JS全局变量是如何工作的?
  2. java求面积_Java之简单图形面积计算
  3. boost::fusion::traits用法的测试程序
  4. OpenCV C++ 04 - Change Brightness
  5. [1.1]XMI 与UML结合开发企业应用中业务模型
  6. MySQL 逻辑架构与常用的存储引擎
  7. cimoc 最新版_Cimoc漫画最新版
  8. 介绍10款常用的JAVA测试工具
  9. Ubuntu 16.04 折腾日记
  10. 5. 学习集合与常用类
  11. SimpleGIS在线地图插件
  12. python可用于数据抓取软件_不懂代码也能爬取数据?试试这几个工具
  13. Android扩展知识 - 减轻C盘压力,扩大C盘空闲容量
  14. Spyder中不能输入中文注释
  15. 中国大学慕课《数据挖掘与python实践》期末测验版本3
  16. Android Beacon 开发(IBeacon)
  17. 第1-7课:基础开胃菜
  18. android SDK buid tools 27.0.3版本离线下载
  19. 用python从身份证中提取生日信息(切片计算)
  20. Formatter格式化

热门文章

  1. python基础(一) P22-P53
  2. 计算机操作系统试题题库及答案(第一章)
  3. 项目级服务器数据迁移流程
  4. 自媒体赚钱多吗,自媒体怎么赚钱,自媒体可以赚到钱吗?
  5. 【java】getAbsolutePath()方法详解
  6. 味尚拉面,半干面的代表,劲道无比,美味可口
  7. vc克罗斯方块c语言代码,球员推荐 | 欧冠赛季闪亮登场​,这些球员值得一看!​...
  8. 2018双11倒计时 | 双11十年牧码梦
  9. Ribbon自定义负载均衡算法
  10. 找红鹰工作手机?还不如直接用华南联络易