【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;
}
相关推荐
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意8 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码8 天前
嵌入式学习路线
学习
毛小茛8 天前
计算机系统概论——校验码
学习
babe小鑫8 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms8 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下8 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。8 天前
2026.2.25监控学习
学习
im_AMBER8 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J8 天前
从“Hello World“ 开始 C++
c语言·c++·学习