HDU3605 Escape——二分图多重匹配

点这里

题意: n个人和m个星球。一个星球上可以住若干个人,给出每个人想要选择的星球,然后给出每个星球最多容纳的人数。问是否能将所有人转移。
题解: 网上有看到网络流+状态压缩的做法,但是这题直接当二分图匹配来做还是比较简单的。无非星球有一定的容量,允许多次匹配。


#include
using namespace std;
const int N = 1e5 + 10;

int n, m;
int G[N][12];
int size[12];
int vis[12], num[12], match[12][N];
bool dfs(int u){
     
	for(int i = 1; i <= m; i++)
		if(G[u][i] && !vis[i]){
     
			vis[i] = 1;
			if(num[i] < size[i]){
     
				match[i][++num[i]] = u;	return true;}
			for(int j = 1; j <= num[i]; j++)
				if(dfs(match[i][j])){
     
					match[i][j] = u;	return true;}
		}
	return false;
}
int main(){
     
	while(~scanf("%d%d", &n, &m)){
     
		for(int i = 1; i <= n; i++)	for(int j = 1; j <= m; j++)	scanf("%d", G[i] + j);
		for(int i = 1; i <= m; i++)	scanf("%d", size + i), num[i] = 0;
		bool flag = true;
		for(int i = 1; i <= n; i++){
     
			for(int j = 0; j < 12; j++)	vis[j] = 0;
			if(!dfs(i)){
     	flag = false;break;}
		}
		if(flag)	printf("YES\n");
		else		printf("NO\n");
	}
	return 0;
}

你可能感兴趣的:(#,二分图匹配,刷题)