读书人

HDU OJ 1083 Courses 【二分图婚配之最

发布时间: 2012-12-22 12:05:07 作者: rapoo

HDU OJ 1083 Courses 【二分图匹配之最大匹配】

原题连接:点击打开链接

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

思路:入门的二分图最大匹配问题,求的最大匹配数ans 若 ans = p 则输出 YES,否则 NO。

代码:

#include<cstdio>#include<cstring>#include<queue>#include<vector>#include<iostream>#include<algorithm>using namespace std;vector<int>V[1000];int link[1000],use[1000];void init(int n){    int i;    for(i=0;i<=n;i++)      V[i].clear();}bool Dfs(int v){    int i,j,k;    for(i=0;i<V[v].size();i++)    {        k=V[v][i];        if(!use[k])        {            use[k]=1;            if(!link[k]||Dfs(link[k]))            {                link[k]=v;                return true;            }        }    }    return false;}int MaxMatch(int n){    int i,j,ans=0;    memset(link,0,sizeof(link));    for(i=1;i<=n;i++)    {        memset(use,0,sizeof(use));        if(Dfs(i))            ans++;    }    return ans;}int main(){    int i,j,n,m,k,t;    scanf("%d",&t);    while(t--)    {        int x,y;        scanf("%d%d",&n,&m);        init(n);        for(i=1;i<=n;i++)        {            scanf("%d",&x);            while(x--)            {                scanf("%d",&y);                V[i].push_back(y);            }        }        int ans=MaxMatch(n);        if(ans==n)          puts("YES");        else          puts("NO");    }}


读书人网 >编程

热点推荐