poj 1469 || hdu 1083 Courses (二分图匹配)

来源:互联网 发布:网络剪刀手win7中文版 编辑:程序博客网 时间:2024/05/29 21:28

题目链接:   hdu 1083

题目大意:   给你N种课程和M个学生,每个学生有自己喜欢的课程

                  若每个课程都能有一个学生代表输出YES,否则NO

解题思路:   把课程作为X集合,学生作为Y集合

                  匈牙利求他们之间的最大匹配数

                  若最大匹配数等于课程数(不可能大于的),则满足题意

                  每种课程都有学生作为代表

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 505int edge[105][MAX];int P,n,cx[105],cy[MAX],visit[MAX];int DFS(int u)    //匈牙利DFS增广{    int i;    for(i=1;i<=n;i++)    {        if(edge[u][i]&&!visit[i])        {            visit[i]=1;            if( !cy[i] || DFS(cy[i]) )            {                cx[u]=i;                cy[i]=u;                return 1;            }        }    }    return 0;}int main(){    int t,i,j,a,b,sum;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&P,&n);        sum=0;        memset(cx,0,sizeof(cx));        memset(cy,0,sizeof(cy));        memset(edge,0,sizeof(edge));        for(i=1;i<=P;i++)        {            scanf("%d",&a);            for(j=1;j<=a;j++)            {                scanf("%d",&b);                edge[i][b]=1;    //单向边            }        }        for(i=1;i<=P;i++)        {if(!cx[i]){    memset(visit,0,sizeof(visit));    sum+=DFS(i);     //增广轨}        }        if(sum==P)     //若最大匹配数等于课程数输出YES            printf("YES\n");else    printf("NO\n");    }    return 0;}


原创粉丝点击