(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;
}