【C++学习第19天】二分图

一、如何判断一个图是二分图?

二、代码

1、判断是否为二分图

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 200010;

int n, m;
int h[N], e[N], ne[N], idx;
int color[N];

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

bool dfs(int u, int c)
{
	color[u] = c;
	for(int i = h[u]; i != -1; i = ne[i]){
		int j = e[i];
		if(!color[j]){
			if(!dfs(j, 3-c))
				return false;
		}
		else if(color[j] == c)
			return false;
	}
}

int main()
{
	scanf("%d%d", &n, &m);

	memset(h, -1, sizeof h);

	while(m--){
		int a, b;
		scanf("%d%d", &a, &b);
		add(a, b), add(b, a);
	}

	bool flag = true;
	for(int i = 1; i <= n; i++)
		if(!color[i]){
			if(!dfs(i, 1)){
				flag = false;
				break;
			}
		}


	if(flag)
		puts("Yes");
	else
		puts("No");
	
	return 0;
}

2、匈牙利算法

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 510, M = 100010;

int n1, n2, m;
int h[N], e[N], ne[N], idx;
int match[N];
bool st[N];

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

bool find(int x)
{
	for(int i = h[x]; i != -1; ne[i]){
		int j = e[i];
		if(!st[j]){
			st[j] = true;
			if(match[j] == 0 || find(match[j])){
				match[j] = x;
				return true;
			}
		}
	}

	return false;
}

int main()
{
	scanf("%d%d%d", &n1, &n2, &m);

	memset(h, -1, sizeof h);

	while(m--){
		int a, b;
		scanf("%d%d", &a, &b);
		add(a, b);
	}

	int res = 0;
	for(int i = 1; i <= n1; i++){
		memset(st, false, sizeof st);
		if(find(i))
			res ++;
	}

	printf("%d\n", res);
	
	return 0;
}
相关推荐
Larry_Yanan2 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
能不能别报错2 小时前
K8s学习笔记(十九) K8s资源限制
笔记·学习·kubernetes
十安_数学好题速析3 小时前
倍数关系:最多能选出多少个数
笔记·学习·高考
vue学习3 小时前
docker 学习dockerfile 构建 Nginx 镜像-部署 nginx 静态网
java·学习·docker
Lynnxiaowen5 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
橘子是码猴子6 小时前
LangExtract:基于LLM的信息抽取框架 学习笔记
笔记·学习
AnySpaceOne7 小时前
笔记本电脑如何连接打印机?完整连接教程送上
学习·电脑
dxnb227 小时前
Datawhale25年10月组队学习:math for AI+Task2线性代数
人工智能·学习·线性代数
wanfeng_097 小时前
python爬虫学习
爬虫·python·学习
A9better8 小时前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习