【模板】二分图

#include "bits/stdc++.h"
using namespace std;
const int z = 131024;
//又是一个基于dfs的算法;
int n, m;
struct EDGE {
	int t, next;
} edge[z<<1];
int head[z], cnt, color[z];
void add_edge(int f,int t) {
	edge[++cnt].next = head[f];
	edge[cnt].t = t;
	head[f] = cnt;
}
//判断是否为二分图;
bool jd_dfs(int u,int p,int c) {
	color[u] = c;
	for(int i = head[u];i;i = edge[i].next) {
		if(edge[i].t == p) continue;
		if(!color[edge[i].t])
			if(!jd_dfs(edge[i].t,u,3-c)) 
				return false;
		if(color[edge[i].t] == c) 
			return false;
	}
	return true;
}
bool judge() {
	bool flag = true;
	for(int i = 1;i <= n;++i) 
		if(!color[i]&&!jd_dfs(i,0,1)) {
			flag = false;
			break;
		}
	return flag;
}
//匈牙利算法;
int match[z];
bool visit[z];
bool hr_dfs(int u) {
	for(int i = head[u];i;i = edge[i].next) {
		if(!visit[edge[i].t]) {
			visit[edge[i].t] = true;
			if(!match[edge[i].t]||hr_dfs(match[edge[i].t])) {
				match[edge[i].t] = u;
				return true;
			} 
		}
	}
	return false;
}
int hungarian() {
	int ans = 0;
	for(int i = 1;i <= n;++i) {
		memset(visit,false,sizeof(visit));
		if(hr_dfs(i)) ++ans;
	}
	return ans;
}

int main() {
	scanf("%d %d",&n,&m);
	for(int i = 1, f, t;i <= m;++i) {
		scanf("%d %d",&f,&t);
		add_edge(f,t);
		add_edge(t,f);
	}
	if(judge()) printf("%d\n",hungarian()/2);
	else printf("false\n");
}
/*
10 13
1 5
1 6
1 8
1 10
2 6
2 7
2 8
2 9
3 5
3 10
4 5
4 6
4 10
*/

@bikuhiku

posted @ 2022-06-05 21:08  bikuhiku  阅读(3)  评论(0编辑  收藏  举报