现在的位置: 首页 > 综合 > 正文

POJ 1469 COURSES

2018年01月11日 ⁄ 综合 ⁄ 共 818字 ⁄ 字号 评论关闭
//Poj1469
//匈牙利算法
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 1001
int n1,n2,m,ans;//n1 n2为二分图俩节点的个数,m为边数
int g[MAX][MAX];//图G的邻接矩阵
int vis[MAX];//Y集合中点i的访问标记
int link[MAX];//link[y]表示当前与y节点相邻的x节点
int n,p;
int dfs(int x){//判断从点X开始有没有增广路
    for(int j = 1;j <= n;j++){
        if(g[x][j] && !vis[j]){//连通并且没有没有被使用过
            vis[j] = 1;
            if(link[j] == -1 || dfs(link[j])){//没有配对 或者 构成增广序列
                link[j] = x;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    int m;
    scanf("%d",&m);
    while(m--){
        scanf("%d%d",&p,&n);
        int count1 = 0;//记录最大匹配值
        memset(g,0,sizeof(g));
        memset(link,-1,sizeof(link));
        int countt,student;
        for(int i = 1;i <= p;i++){
            scanf("%d",&countt);
            for(int j = 1;j <= countt;j++){
                scanf("%d",&student);
                g[i][student] = 1;
            }
        }
        for(int i = 1;i <= p;i++){
            memset(vis,0,sizeof(vis));
            if(dfs(i)) {
                    count1++;
                    //cout<<"11"<<endl;
            }
        }
       // cout<<count1<<endl;
        if(count1 == p) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

抱歉!评论已关闭.