【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;
}
相关推荐
ThreeYear_s1 小时前
基于FPGA的PID算法学习———实现PI比例控制算法
学习·算法·fpga开发
银色的白3 小时前
工作记录:人物对话功能开发与集成
vue.js·学习·前端框架
新中地GIS开发老师4 小时前
三维GIS开发cesium智慧地铁教程(4)城市白模加载与样式控制
学习·arcgis·智慧城市·webgl·gis开发·webgis·地理信息科学
Studying 开龙wu5 小时前
机器学习监督学习实战五:六种算法对声呐回波信号进行分类
学习·算法·机器学习
软件开发技术深度爱好者5 小时前
HTML版英语学习系统
学习·html
nenchoumi31195 小时前
UE5 学习系列(二)用户操作界面及介绍
windows·学习·ue5·机器人
NULL指向我5 小时前
香橙派3B学习笔记9:Linux基础gcc/g++编译__C/C++中动态链接库(.so)的编译与使用
笔记·学习
ThreeYear_s6 小时前
基于FPGA的PID算法学习———实现PID比例控制算法
学习·算法·fpga开发
_李小白7 小时前
【OSG学习笔记】Day 18: 碰撞检测与物理交互
笔记·学习·游戏·3d
Sleepless_斑马7 小时前
【FFmpeg学习(1)】图像表示
学习·ffmpeg