题意:

                     有N(<=100000)个人要逃离到M(<=10)个星球..每个人有喜欢的星球与不喜欢的星球..而每个星球的容量是有限的..问能否让所有人都在自己喜爱的星球上..

            题解:

                     二分图还是有些东西要搞得...第一次接触这种问题..开始用网络流暴..结果超时了...网络流写好点是可以过的..我的dinic效率太低了..要改进...本题其实是一个二分图多重匹配的问题..其解法和匈牙利差不多..用一个数组存下之前已经放好的..已备后面的调整..


Program:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<string.h>
#include<queue>
#define ll long long
#define esp 1e-5
#define MAXN 2000000
#define MAXM 50000000
#define oo 100000007
using namespace std;
int C[15],num[15],n,m,line[15][100005];
bool arc[100005][15],used[15];
bool dfs(int x)
{
int i,j;
for (i=1;i<=m;i++)
if (arc[x][i] && !used[i])
{
used[i]=true;
if (num[i]<C[i])
{
line[i][++num[i]]=x;
return true;
}
for (j=1;j<=num[i];j++)
if (dfs(line[i][j]))
{
line[i][j]=x;
return true;
}
}
return false;
}
int getans()
{
int i;
memset(num,0,sizeof(num));
for (i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if (!dfs(i)) return false;
}
return true;
}
int main()
{
int i,j,x;
while (~scanf("%d%d",&n,&m))
{
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
scanf("%d",&x);
arc[i][j]=x;
}
for (i=1;i<=m;i++) scanf("%d",&C[i]);
if (getans()) printf("YES\n");
else printf("NO\n");
}
return 0;
}