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;    

}

 

你可能感兴趣的:(poj)