#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100001
int n,m;
int limit[11];
int g[N][11];
int linker[11][N];
bool vis[11];
int cnt[11];
bool dfs(int u){
for(int v=1;v<=m;v++){
if(!vis[v]&&g[u][v]){
vis[v]=1;
if(cnt[v]+1<=limit[v]){
linker[v][++cnt[v]]=u;
return true;
}
else {
for(int j=1;j<=cnt[v];j++){
if(dfs(linker[v][j])){
linker[v][j]=u;
return true;
}
}
}
}
}
return false;
}
int hungary(){
int ans=0;
memset(linker,-1,sizeof(linker));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(!dfs(i)) return 0;//只要有一个不行就行了,不然会超时
}
return 1;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(g,0,sizeof(g));
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",&limit[i]);
int ans=hungary();
if(ans==1) printf("YES\n");
else printf("NO\n");
}
return 0;
}
各种超时。。。。。
结果发现C++过了,G++一直超时。。。。
这题也可以将每个容量变成一个新的点,转化成一般的二分图匹配,估计会超时。。。
这题用最大流同样可以求解。