题目大意:
N(N<100,000)个人要去M(M<10)个星球,每个人只可以去一些星球,一个星球最多容纳Ki个人,输出是否所有人都可以选择自己的星球。
#include<bits/stdc++.h>
using namespace std;
int map1[100005][15],top,book[15],f[15][100005],cnt[15],w[15];
struct node
{
int u,next;
}e[100010*3];
/*void add(int u,int v)
{
e[top].u=v;
e[top].next=head[u];
head[u]=top++;
}*/
int n,m;
int dfs(int x)
{
for(int i=0;i<m;i++)
{
//int u=e[i].u;
if(!book[i]&&map1[x][i])
{
book[i]=1;
if(cnt[i]<w[i])
{
f[i][cnt[i]++]=x;
return 1;
}
for(int j=0;j<cnt[i];j++)
{
if(dfs(f[i][j]))
{
f[i][j]=x;
return 1;
}
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(map1,0,sizeof(map1));
memset(f,0,sizeof(f));
memset(cnt,0,sizeof(cnt));
//top=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int a;
scanf("%d",&a);
if(a==1)
{
map1[i][j]=1;
}
}
}
for(int i=0;i<m;i++)
{
scanf("%d",&w[i]);
}
int flag=1;
for(int i=0;i<n;i++)
{
memset(book,0,sizeof(book));
if(!dfs(i))
{
flag=0;
break;
}
}
if(flag)
{
printf("YES\n");
}
else printf("NO\n");
}
}