Hdu 3605(二分图+多重匹配)

Hdu 3605

 

(1)题意:

一个星球上可以住若干个人,给出每个人想要选择的星球,然后给出每个星球最多容纳的人数。

 

(2)思路:

二分图的多重匹配,将一个用二维数组存储每个星球能够待的编号如果人数小于星球的最大人数,

就可以住在这个星球,否则回溯修改之前的路径,查找之前的路径能否有其他情况。

 

(3)代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int mp[maxn][12],vis[12],link[12][maxn],m,n,val[12],size[12];
bool dfs(int x){
	for(int i=1;i<=m;i++)
	if(mp[x][i]==1&&vis[i]==0){
		vis[i] = 1;
		if(size[i]<val[i]){
			link[i][++size[i]] = x;
			return true;
		}
		for(int j=1;j<=size[i];j++)
		if(dfs(link[i][j])){
			link[i][j] = x;
			return true;
		}
	}
	return false;
}
int main(void){
	while(~scanf("%d%d",&n,&m)){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				scanf("%d",&mp[i][j]);
			}
		}
		memset(size,0,sizeof(size));
		for(int i=1;i<=m;i++) scanf("%d",&val[i]);
		int fg = 0;
		for(int i=1;i<=n;i++){
			memset(vis,0,sizeof(vis));
			if(!dfs(i)){
				fg = 1;break;
			}
		}
		if(!fg) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值