【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;
}
相关推荐
David猪大卫9 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger9 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
fengci.10 小时前
CTF2MISC中等部分
开发语言·前端·学习
YueTann12 小时前
mgtv5th-baseline学习
学习
蒸蒸yyyyzwd13 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气13 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
路灯上の马陈16 小时前
Java 内部类 学习笔记
笔记·学习
前进的李工16 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
li星野17 小时前
从 DICOM 到声学属性学习记录:HU 值怎么变成密度和声速
学习
自信1504130575917 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法