二分图求最大匹配,匈牙利

本文介绍了一个基于Hungry算法解决的二分图问题,通过贪心策略实现最少边数保留,确保图中每个节点的度数至少为一。文章提供了一份详细的C++实现代码,并讨论了算法的具体实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

呃……hungry的原理应该是感性理解一下就能懂……

反正就是一路往前增广嘛……感性理解一下,贪心肯定就是最优了


今天考试的T1,签到题想撞壁打算yy一下hungry,不幸RE,忘了在dfs的时候打个vis

题目大意:二分图,求保留最少边数使每个点度数至少为一


不管了,假装是个hungry的版吧23333

应该没有什么bug,反正这个算法模拟一下就好……听说跑得挺快然而……人丑自带大常数2333

#include<bits/stdc++.h>
#define MAXN 2005
#define MAXM 1000005
using namespace std;	int n,m,k;
struct t1{
	int to,nxt;
}edge[MAXM<<1];	int cnt_edge=0;
int fst[MAXN];
void addedge(int x,int y){
	edge[++cnt_edge].to=y;
	edge[cnt_edge].nxt=fst[x];
	fst[x]=cnt_edge;
}

int tag[MAXN],cnt=0;
int vis[MAXN];

int dfs(int now,int stp){
//	printf("%d\n",now);
	if(vis[now])	return 0;
	vis[now]=1;
	for(int tmp=fst[now];tmp;tmp=edge[tmp].nxt){
		if(edge[tmp].to==tag[now]||vis[edge[tmp].to])	continue;
		if(!tag[edge[tmp].to])	
			return	tag[now]=edge[tmp].to,tag[edge[tmp].to]=now,1;
		else{
			if(dfs(tag[edge[tmp].to],stp+1))
				return tag[edge[tmp].to]=now,tag[now]=edge[tmp].to,1;
		}
	}
	return 0;
}


int read_x,read_y;
int main(){
	freopen("CONF.in","r",stdin);
	freopen("CONF.out","w",stdout);
	
	scanf("%d%d%d",&n,&m,&k);
	
	for(int i=1;i<=k;++i){
		scanf("%d%d",&read_x,&read_y);
		addedge(read_x,read_y+n);
		addedge(read_y+n,read_x);
	}

	int nn=n+m;
	for(int i=1;i<=nn;++i){
		memset(vis,0,sizeof vis);
		if(!tag[i])	
			if(dfs(i,1))	++cnt;
	}
	for(int i=1;i<=nn;++i)	if(!tag[i])	++cnt;
	printf("%d",cnt);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值