首页 > 其他分享 >「二分图」笔记

「二分图」笔记

时间:2024-04-15 13:22:04浏览次数:28  
标签:二分 false int top 笔记 dfs return

二分图同时满足 不存在奇数环 和 染色法不矛盾。

二分图的判定:染色法

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10, M = 2e6 + 10;
struct
{
	int to, next;
}e[M];
int top, h[N], color[N], n, m;

void add(int x, int y)
{
	e[++top] = {y, h[x]};
	h[x] = top;
}

bool dfs(int x, int c)
{
	color[x] = c;
	for (int i = h[x]; i ; i = e[i].next)
	{
		int y = e[i].to;
		if (!color[y])
		{
			if (dfs(y, (c == 1 ? 2 : 1))) return true;
		}
		else if (color[y] == c) return true;
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m;
	for (int i = 1; i <= m; i ++)
	{
		int x, y;
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	bool flag = false;
	for (int i = 1; i <= n; i ++)
	{
		if (!color[i])
			if (dfs(i, 1))
			{
				flag = true;
				break;
			}		
	}
	cout << (flag ? "No" : "Yes");
	
	return 0;
}

二分图的最大匹配:匈牙利算法(贪心 + dfs)

若二分图中有一子图满足任意两条边没有公共节点,则称为一组匹配,

边数最多的子图为该二分图的最大匹配。

#include <bits/stdc++.h>
#define re register int 
using namespace std;
const int N = 1e3 + 10, M = 5e4 + 10;
struct edge
{
	int to, next;
}e[M];
int top, h[N];
int a, b, m, ans, match[N];
bool vis[N];

inline void add(int x, int y)
{
	e[++ top] = (edge){y, h[x]};
	h[x] = top;
	return;
}

bool dfs(int u)
{
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		if (vis[v]) continue;
		vis[v] = true;
		if (!match[v] || dfs(match[v]))
		{
			match[v] = u;
			return true;
		}
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> a >> b >> m;
	for (re i = 1; i <= m; i ++)
	{ 
		int x, y; cin >> x >> y;
		add(x, y);
	}
	for (re i = 1; i <= a; i ++)
	{
		memset(vis, false, sizeof(vis));
		if (dfs(i)) ans ++;
	}
	cout << ans; //最大匹配的边数
	
	return 0;
}

标签:二分,false,int,top,笔记,dfs,return
From: https://www.cnblogs.com/hi-zwjoey/p/18135740

相关文章

  • 「树链剖分」 学习笔记
    一,树链剖分的思想与概述正如其名,树链剖分用于将树剖分成若干条链的形式,以维护树上路径的信息,其中剖分出的链有多种形式,最常见的是重链,还有长链或更多其它的链。其中剖分出的链为重链时,就引出了下文的主角「重链剖分」。重链剖分能保证划分出的每条重链上的节点DFS序连续,因此......
  • day06_我的Java学习笔记 (综合应用专题课)
    专题课(综合案例)案例一:买飞机票案例二:找素数上述老师代码有点问题,即:j<i/2;应为j<=i/2;见如下判断:其实出问题的点,只会在i=4时,因为当i=4时,j<i/2:不成立,直接跳过该循环,执行步骤3的操作了。(当范围不是101-200,而是包含了4,则会出现上述的现象,因4不满......
  • day04_我的Java学习笔记 (数组的静态初始化、数组的动态初始化,debug调试等)
    1.数组1.1数组的定义那python怎么定义数组的呢?Java:String[]names={"zhangsan","lisi","wangwu"}Python:names=["zhangsan","lisi","wangwu"]在python中,列表可以存储不同类型的数据,而在Java中,数组只能存储相同类型的数据。1......
  • day02_我的Java学习笔记 (类型转换、+做连接符、变量自增自减运算、三元运算符、键盘
    Java语言基础知识1.类型转换1.1自动类型转换1.2表达式的自动类型转换1.3强制类型转换这里得出的结果为啥是-36呢???后面高级篇再细讲。2.运算符2.1算数运算符2.1.1基本算数运算符2.1.2案例:数值拆分2.2+符号做连接符【思考1】:a+'a'为啥......
  • day01-02_我的Java学习笔记 (IDEA的安装、配置及使用、IDEA常用快捷键、IEDA创建空工
    1.IDEA的安装及配置1.1IDEA的安装具体操作,详见《04、IDEA安装详解.pdf》1.2IDEA主题配置、字体配置1.3IDEA常用快捷键1.4IDEA修改快捷键在IDEA工具中,Ctrl+空格的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中......
  • day01-03_我的Java学习笔记(Java基础语法--注释、字面量、变量、二进制、ASCII编码、
    1.Java基础语法1.1注释1.2字面量(Python中叫数据类型)1.3变量1.3.1变量的定义及使用1.3.2变量使用注意事项1.4数据的存储形式:二进制字节、字、bit、byte的关系:字word字节byte位bit,来自英文bit,音译为“比特”,表示二进制位。字长是指字的......
  • 《线性代数的本质》笔记(04-附注1-05)
    04-矩阵乘法与线性变换复合的联系问:如何描述连续两个线性变换?答:先左乘一个矩阵,再左乘一个。如果我们用一个矩阵来描述这个复合过程,那么这个矩阵应该等于两个矩阵的乘积,这就是矩阵的乘法。如何理解上图:把右侧矩阵M2看作看作第一次变换后的\(\hat{i}\)向量和\(\hat{j}\)向量,......
  • 抽象代数课程笔记
    抽象代数的意义:\(\newcommand{\a}{\alpha}\newcommand{\b}{\beta}\newcommand{\D}{\Delta}\newcommand{\eps}{\varepsilon}\newcommand{\ph}{\varphi}\newcommand{\t}{\theta}\newcommand{\la}{\lambda}\newcommand{\si}{\sigma}\newcommand{\d......
  • 【二分+容斥】【ST表/单调栈】【划分型DP】
    二分+容斥题目链接https://leetcode.cn/problems/kth-smallest-amount-with-single-denomination-combination/description/题目大意题目思路假设有一个x元硬币思考只有一种面额为3的硬币时,3可以组成不超过x的面额的数量有x/3种!思考有两种面额【3,6】,可以组成不......
  • 《人人都是产品经理》笔记分享
    通过最近对《人人都是产品经理》书籍的学习,理解,讨论,再总结。个人觉得收获很大,总结出课程大纲并夹带者一些理解以读书笔记的形式分享给大家。有理解不到位的地方,请各位读者海涵。最后感谢苏杰老师的知识分享,使得每个读者心中有一颗产品意识的种子,在未来的某一天悄然发芽。0.0......