hdu 1083 Courses(二分图最大匹配)

来源:互联网 发布:开通淘宝客后怎么开始 编辑:程序博客网 时间:2024/04/29 12:41

题意:有p门的课,每门课都有若干学生,现在要为每个课程分配一名课代表,每个学生只能担任一门课的课代表,如果每个课都能找到课代表,则输出"YES",否则"NO"。

思路:匈牙利算法模板。
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define MAXN 305int g[MAXN][MAXN];int uN,vN;int linker[MAXN];bool used[MAXN];bool dfs(int u){    int v;    for(v=1; v<=vN; v++)        if(g[u][v]&&!used[v])        {            used[v]=true;            if(linker[v]==-1||dfs(linker[v]))            {                linker[v]=u;                return true;            }        }    return false;}int hungary(){    int res=0,u;    memset(linker,-1,sizeof(linker));    for(u=1; u<=uN; u++)    {        memset(used,0,sizeof(used));        if(dfs(u))  res++;    }    return res;}int main(){    int u,v;    int T,i,n;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&uN,&vN);        memset(g,0,sizeof(g));        for(u=1; u<=uN; u++)        {            scanf("%d",&n);            while(n--)            {                scanf("%d",&v);                g[u][v]=1;            }        }        if(uN==hungary())  printf("YES\n");        else  printf("NO\n");    }    return 0;}
1 0
原创粉丝点击