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;
    }
}

 

上一篇:POJ_1083


下一篇:[gic]-ARM gicv2/gicv3的详解