设为首页 加入收藏

TOP

poj 1469 COURSES (最大匹配)
2013-01-01 14:46:48 来源: 作者: 【 】 浏览:249
Tags:poj  1469  COURSES  最大 匹配

    题目意思:

    有N个学生和P门课程,让你判断能否构成最大匹配。

    先输入一个T,表示有T组测试数据;

    在输入N和P,P表示有P门课程,N表示有N个学生。

    之后有P行,比如:

    a  a1 a2 a3 a4 a5---第一行。1与a1,a2,a3,a4,a5有匹配。

    b b1 b2 b3-----第二行。b与b1,b2,b3有匹配。

    如果匹配数等于学生数目则YES;

    否则为NO;

    [cpp]

    #include"stdio.h"

    #include"string.h"

    #define N 501

    int n,m,map[N][N],mark[N],link[N];

    int dfs(int t)

    {

    int i;

    for(i=1;i<=m;i++)

    {

    if(!mark[i]&&map[t][i])

    {

    mark[i]=1;

    if(link[i]==-1||dfs(link[i]))

    {

    link[i]=t;

    return 1;

    }

    }

    }

    return 0;

    }

    int MaxMatch()

    {

    int i,num;

    num=0;

    memset(link,-1,sizeof(link));

    for(i=1;i<=m;i++)

    {

    memset(mark,0,sizeof(mark));

    if(dfs(i))

    num++;

    }

    return num;

    }

    int main()

    {

    int i,j,a,b,T,ans;

    scanf("%d",&T);

    while(T--)

    {

    scanf("%d%d",&n,&m);

    memset(map,0,sizeof(map));

    for(i=1;i<=n;i++)

    {

    scanf("%d",&a);

    for(j=0;j<a;j++)

    {

    scanf("%d",&b);

    map[i][b]=1;

    }

    }

    ans=MaxMatch();

    //printf("%d\n",ans);

    if(MaxMatch()==n)

    printf("YES\n");

    else

    printf("NO\n");

    }

    return 0;

    }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++中强制类型转换操作符小结 下一篇poj1009 Edge Detection

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: