hdu1083course 匈牙利基础题.8.12日常周日开始学习

输入课程数p和学生数q.然后是p行,每行开头是这门课选的人数n,之后n个学生编号。问是否每个人都能找到自己喜欢的课.每门课只能被选一次哟

匈牙利算法是二分图中最经典的算法了.主要思想是当匹配第n个课程时.依次看n的连线.如果遇到可连的就直接连接.不可连接就看看想连接但是已经有对象的人是不是可以换个人连接233333.

#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <map>
#define xh(i,m,n) for(int i=m;i<=n;i++)
#define se(w) scanf("%lf",&w)
#define ss(o) scanf("%s",o)
#define sd(q) scanf("%d",&q)
using namespace std;
int s,d,f[305][305],vis[305],p[305];
int dfs(int c)
{
    xh(i,1,d)
    {
        if(!vis[i]&&f[i][c])
        {
            vis[i]=1;
                if(!p[i]||dfs(p[i]))
                {
                    p[i]=c;
                    return 1;
                }
        }
    }
    return 0;
}
int main()
{
    int ans,k;sd(k);
    while(k--)
    {   ans=0;
        memset(p,0,sizeof(p));
        memset(f,0,sizeof(f));
        sd(s);sd(d);
        xh(i,1,s)
        {
            int n;sd(n);
            xh(j,1,n)
            {
                int peo;sd(peo);
                f[peo][i]=1;
            }

        }
        xh(i,1,s)
        {
            memset(vis,0,sizeof(vis));
            if(dfs(i))
                ans+=1;
        }
        if(ans==s)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_35557621/article/details/81604366