1. 程式人生 > >hdu3605 二分圖多重匹配(hungary演算法)

hdu3605 二分圖多重匹配(hungary演算法)

有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; }