poj 1469 COURSES 最大匹配

题意

  P个课程,N个学生,之间有边连接,问是否可以 P个学生选择不同的P个课程。

解题思路

  最大匹配

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

const int N = 310;

int p, n;
bool g[110][310];
int ma[N], mb[N];
bool vis[N];

int path( int u ){
    for(int v = 1; v <= n; v++){
        if( g[u][v] && !vis[v] ){
            vis[v] = 1;
            if( ma[v] == -1 || path( ma[v] )){
                ma[v] = u; mb[u] = v;
                return 1;    
            }    
        }    
    }    
    return 0;
}
int main(){
    int T;
    scanf("%d", &T);
    while( T-- ){
        scanf("%d%d", &p, &n );
        memset( g, 0, sizeof(g));
        for(int i = 1; i <= p; i++){
            int cnt = 0, st;
            scanf("%d", &cnt );
            for(int j = 0; j < cnt; j++){
                scanf("%d", &st);
                g[i][st] = 1;    
            }
        }    
        memset( ma, 0xff, sizeof(ma));
        memset( mb, 0xff, sizeof(mb));
        int res = 0;
        for(int i = 1; i <= p; i++){
            if( mb[i] == -1 ){
                memset( vis, 0, sizeof(vis));    
                res += path( i );
            }    
        }
        puts( res == p ? "YES" : "NO" );
    }
    return 0;    
}
原文地址:https://www.cnblogs.com/yefeng1627/p/2995894.html