二分图相关模板

二分图最大匹配

#include<iostream>
using namespace std;
int n,m,k;
int map[MAXN][MAXN];//存储二分图的关系
int link[MAXN],used[MAXN];//link=-1是未连接,used代表是否用过

int dfs(int x) {
	for(int i=1; i<=m; i++) {//注意此处的m,右部的大小,map[][m] 
		if(map[x][i] && ! used[i]) {
			used[i]=1;
			if(link[i]==-1 || dfs(link[i])) {
				link[i]=x;
				return 1;
			}
		}
	}
	return 0;
}

void work() {
	int sum=0;
	for(int i=1; i<=n; i++) {//注意此处n,左部的大小,map[n][] 
		memset(used,0,sizeof(used));//每次都要把used置空
		if(dfs(i)) {
			sum++;
		}
	}
	cout<<sum<<endl;//注意如果存无向图,可能要除以二,自己注意
}

int main() {
	memset(link,-1,sizeof(link));
	memset(map,0,sizeof(map));
}

二分图判定(上色)

#include<iostream>
#include<queue>
using namespace std;
int n,m,k;

vector<int>e[MAXN];//用vector存图
int color[MAXN];

bool bfs(int s) {//上色代码 
	queue<int> q;
	q.push(s);
	color[s]=1;//上色 1 
	while(!q.empty()) {
		int now=q.front();
		q.pop();
		for(int i=0; i<e[now].size(); i++) {//遍历与之相连的点 
			int v=e[now][i];
			if(color[v]==-1) {//如果没上过色,上色为!1,也就是0,未上色是-1 
				color[v]=!color[now];
				q.push(v);
			}
			if(color[v]==color[now]) {
				return 0;
			}
		}
	}
	return 1;
}

bool dfs(int u) {//最大匹配代码 
	for(int i=0; i<e[u].size(); i++) {
		int v=e[u][i];
		if(!vis[v]) {
			vis[v]=1;
			if(match[v]==0||dfs(match[v])) {
				match[v]=u;
				return 1;
			}
		}
	}
	return 0;
}

int main() {
	for(int i=0; i<MAXN; i++) {
		e[i].clear();
	}
	memset(color,-1,sizeof(color));
}

posted @ 2021-07-16 19:32  cheems~  阅读(26)  评论(0编辑  收藏  举报