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

来源:互联网 发布:最全双色球缩水软件 编辑:程序博客网 时间:2024/06/06 14:09

有n个人要到m个星球上,每个人只能去某些特定的星球,每个星球有最大容纳量,问能不能让每个人都到星球上。

#include<bits/stdc++.h>using namespace std;#define mod 1000000007#define PI acos(-1.0)#define INF 0x3f3f3f3ftypedef 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;}
0 0
原创粉丝点击