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

来源:互联网 发布:哪个药店软件正品 编辑:程序博客网 时间:2024/06/06 09:20

        题目大意:有 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;}