UVALive 6851 The Programmers(二分图多重匹配)

来源:互联网 发布:java开发工程师工资 编辑:程序博客网 时间:2024/06/06 02:50

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=79617

题意:每组case给你P, S, C, m,代表有P个人,S个赛区,每个赛区最多能容纳C个人,接下来m行输入代表  x y 代表 第x个人只能去 赛区 y,

            问最多有多少人可以参加比赛。

题解:直接套模板。或者跑最大流,建图比较简单。

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>#include <map>#include <cstdlib>#include <cmath>#include <vector>#include <set>#include <queue>using namespace std;typedef long long ll;const int MAXN = 505;const int MAXM = 25;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))res++;    }    return res;}int main() {#ifdef ONLINE_JUDGE#else    freopen("test.in", "r", stdin);#endif    int T;    scanf("%d",&T);    while(T--) {        int C,m;        scanf("%d%d%d%d",&uN,&vN,&C,&m);        for(int i=0; i<vN; i++) {            num[i]=C;        }        memset(g,0,sizeof(g));        for(int i=0; i<m; i++) {            int u,v;            scanf("%d%d",&u,&v);            u--;            v--;            g[u][v]=1;        }        printf("%d\n",hungary());    }    return 0;}


0 0