POJ 1469 COURSES (二分匹配) - from lanshui_Yang

        题目大意:有 p 个学生和 n 门课 , 每一个门课程可以被多个学生选,问:在每个学生只能选一门课的情况下,能否使这 p 个学生每个人选的课程都不相同?

        解题思路:这是一道简单的求最大匹配问题,只要求出此图的最大匹配,然后判断是否与 p 相等即可。

        请看代码:

#include <iostream>
#include <set>
#include <algorithm>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <cstring>
#include <map>
#include <vector>
#include <string>
#include <cmath>
#define eps 1e-7
#define mem(a , b) memset(a , b , sizeof(a) )
using namespace std ;
const int MAXN = 500 ;
int linkx[MAXN] ;
vector<int> G[MAXN] ;
int p , n ;
bool vis[MAXN] ;
void chu()
{
    mem(linkx , -1) ;
    int i ;
    for(i = 0 ; i <= p ; i ++)
    G[i].clear() ;
}
void init()
{
    scanf("%d%d" , &p , &n) ;
    int i ;
    for(i = 1 ; i <= p ; i ++)
    {
        int d ;
        scanf("%d" , &d) ;
        int j ;
        for(j = 0 ; j < d ; j ++)
        {
            int t ;
            scanf("%d" , &t) ;
            G[i].push_back(t) ;
        }
    }
}
int dfs(int u)
{
    int i ;
    for(i = 0 ; i < G[u].size() ; i ++)
    {
        int v = G[u][i] ;
        if(!vis[v])
        {
            vis[v] = true ;
            if(linkx[v] == -1 || dfs(linkx[v]))
            {
                linkx[v] = u ;
                return 1 ;
            }
        }
    }
    return 0 ;
}
void solve()
{
    int i ;
    int ans = 0 ;
    for(i = 1 ; i <= p ; i ++)
    {
        mem(vis , 0) ;
        ans += dfs(i) ;
    }
    if(ans == p)
    {
        puts("YES") ;
    }
    else
    {
        puts("NO") ;
    }
}
int main()
{
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        chu() ;
        init() ;
        solve() ;
    }
    return 0;
}

      

你可能感兴趣的:(二分匹配)