HDU - 1083 Courses (二分图最大匹配模板)

Posted tianwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1083 Courses (二分图最大匹配模板)相关的知识,希望对你有一定的参考价值。

题意:给出P门课程,N个学生。
每一门课程可能有多个学生感兴趣
然后我们需要匹配,使得每一门课程都只包含一名对其感兴趣的学生
问:能否匹配成立
思路:这个就是典型的二分图匹配问题。常用匈牙利算法

完整代码:(一开始写成了无向图....)写成有向图是因为学生是可以剩余的

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e3;
const int maxm = 1e6;
int match[maxn];
int vis[maxn];
int head[maxn]; 
int top,ans;
int n,m;
struct Edge

    int v,next;
edge[maxm];
void add(int u,int v)
    edge[top].v = v;
    edge[top].next = head[u];
    head[u] = top++;

void init()
    memset(head,-1,sizeof(head));
    memset(match,0,sizeof(match));
    top = ans = 0;

//匈牙利算法:递归找增广路径
bool Find(int u)
    for(int i = head[u]; ~i ;i =edge[i].next)
        int v = edge[i].v;
        if(!vis[v])
            vis[v] = 1;
            if(!match[v]||Find(match[v]))
                match[v] = u;
                return true;
            
        
    
    return false;

int main()
    int T;
    cin>>T;
    while(T--)
        cin>>n>>m;
        int num;
        init();
        for(int i = 1;i<=n;i++)
            cin>>num;
            while(num--)
                int v;
                cin>>v;
                add(i,v);
            
        
        for(int i = 1;i<=n;i++)
            memset(vis,0,sizeof(vis));
            if(Find(i)) ans++;
        
        if(ans==n) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    

 

以上是关于HDU - 1083 Courses (二分图最大匹配模板)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1083 :Courses(二分图匹配)

HDU - 1083 Courses(二分图匹配)

二分图的最大匹配(匈牙利算法)HDU1083

HDU1083(KB10-C 二分图最大匹配)

HDOJ1083-Courses(二分图匹配(匈牙利算法))

HDU-1083-Courses(最大匹配)