题目:

A - The Perfect Stall_数据

 

题目网址:1274 -- The Perfect Stall (poj.org)

  思路:

给定N个牛,M个市场,每个牛都有几个最适的市场,需求市场对应奶牛的最多个数;

利用二分查找以及匈牙利算法进行匹配;

  代码实现:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxn = 205;
int a[maxn][maxn], match[maxn];
int n,m,ans;
bool visited[maxn];
bool dfs(int k){
    for(int i=1; i<=a[k][0]; ++i){//对奶牛进行处理
        int v = a[k][i];//标记奶牛的市场
        if(!visited[v]){//判断这个市场是否循环过
            visited[v]=true;
            if(!match[v] || dfs(match[v])){//判断市场是否有牛,在判断牛是否相同
                match[v] = k;
                return true;
            }
        }
    }
    return false;
}
void search(){
    for(int i=1;i<=n;++i){
        memset(visited,0,sizeof(visited));
        if(dfs(i))
            ans++;
    }
}

int main(){

    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(match,0,sizeof(match));//对数组进行清空
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;++i){
        cin>>a[i][0];//输入数据
        for(int j=1;j<=a[i][0]; ++j){
            cin>>a[i][j];
         }
       }
       ans=0;
       search();//进行二分查找
       cout<<ans<<endl;
    }


    return 0;
}