题目:
题目网址: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; }