这题的时间 卡得很彻底....各种循环优化,外加一个前驱记录,匈牙利匹配的运用。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m;
int line[100002][12];
bool used[12];
int girl[12];
int ok[12][100002];
int cnt[12];
bool find(int x){
int i,j;
for (j = 0; j < m; j++){ //扫描
if (line[x][j] == true && used[j] == false){
//如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)
used[j] = 1;
if (girl[j] != 0) {
girl[j]--;
ok[j][cnt[j]] = x;
cnt[j]++;
return true;
}
for (int i = 0; i < cnt[j]; i++)
if (find(ok[j][i])){
ok[j][i] = x;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d%d", &n, &m)){
int flag = 0;
memset(ok, 0, sizeof(ok));
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &line[i][j]);
for (int i = 0; i < m; i++)
scanf("%d", &girl[i]);
for (int i = 0; i < n; i++){
memset(used, 0, sizeof(used));
if (!find(i)){
flag = 1;
break;
}
}
if (!flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}