hdu3605 二分圖多重匹配(hungary演算法)
阿新 • • 發佈:2018-12-30
有n個人要到m個星球上,每個人只能去某些特定的星球,每個星球有最大容納量,問能不能讓每個人都到星球上。
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
typedef long long LL;
typedef unsigned long long ULL;
const int MAXN = 100010;
const int MAXM = 15;
int uN,vN;
int g[MAXN][MAXM];
int linker[MAXM][MAXN];
bool used[MAXM];
int num[MAXM];//右邊最大的匹配數
bool dfs(int u)
{
for(int v = 0; v < vN;v++)
if(g[u][v] && !used[v])
{
used[v] = true; if(linker[v][0] < num[v])
{
linker[v][++linker[v][0]] = u;
return true;
}
for(int i = 1;i <= num[0];i++)
if(dfs(linker[v][i]))
{
linker[v][i] = u;
return true;
}
}
return false;
}
int hungary()
{
int res = 0;
for(int i = 0;i < vN;i++) linker[i][0] = 0;
for(int u = 0; u < uN; u++)
{
memset(used,false,sizeof(used)); if(!dfs(u))return 0;
}
return 1;
}
int main(){
while(~scanf("%d%d",&uN,&vN)){
memset(linker,0,sizeof(linker));
for(int i=0;i<uN;i++){
for (int j=0;j<vN;j++){
scanf("%d",&g[i][j]);
}
}
for(int i=0;i<vN;i++){
scanf("%d",&num[i]);
}
if(hungary())printf("YES\n");
else printf("NO\n");
}
return 0;
}