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