Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19908 | Accepted: 9009 |
Description
Input
Output
Sample Input
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
Sample Output
4
题意 :农夫新建了牛棚,一个牛栏只能容纳一只牛,而每只牛都有自己喜欢的牛栏,给出每只牛喜欢的牛棚,问最多能够匹配多少头牛。
分析:二分图匹配问题。求出最大分配方案。
题目链接:http://poj.org/problem?id=1274
代码清单:
#include<map> #include<cmath> #include<ctime> #include<queue> #include<stack> #include<cctype> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef unsigned int uint; typedef long long ll; typedef unsigned long long ull; const int maxv = 200 + 5; int N,M; int n,m; bool vis[maxv]; int match[maxv]; bool graph[maxv][maxv]; void init(){ memset(match,-1,sizeof(match)); memset(graph,false,sizeof(graph)); } bool dfs(int u){ for(int v=1;v<=M;v++){ if(!vis[v]&&graph[u][v]){ vis[v]=true; if(match[v]==-1 || dfs(match[v])){ match[v]=u; return true; } } }return false; } int max_match(){ int sum=0; for(int i=1;i<=N;i++){ memset(vis,false,sizeof(vis)); if(dfs(i)) sum++; }return sum; } int main(){ while(scanf("%d%d",&N,&M)!=EOF){ init(); for(int i=1;i<=N;i++){ scanf("%d",&n); while(n--){ scanf("%d",&m); graph[i][m]=true; } } printf("%d\n",max_match()); }return 0; }
#include<map> #include<cmath> #include<ctime> #include<queue> #include<stack> #include<cctype> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef unsigned int uint; typedef long long ll; typedef unsigned long long ull; const int maxv = 200 + 5; struct Edge{ int to,next; }edge[maxv*maxv]; int N,M; int n,m,index; bool vis[maxv]; int match[maxv]; int head[maxv*maxv]; void init(){ index=1; memset(head,0,sizeof(head)); memset(match,-1,sizeof(match)); } void add(int u,int v){ edge[index].to=v; edge[index].next=head[u]; head[u]=index++; } bool dfs(int u){ for(int i=head[u];i!=0;i=edge[i].next){ int v=edge[i].to; if(!vis[v]){ vis[v]=true; if(match[v]==-1 || dfs(match[v])){ match[v]=u; return true; } } }return false; } int max_match(){ int sum=0; for(int i=1;i<=N;i++){ memset(vis,false,sizeof(vis)); if(dfs(i)) sum++; }return sum; } int main(){ while(scanf("%d%d",&N,&M)!=EOF){ init(); for(int i=1;i<=N;i++){ scanf("%d",&n); while(n--){ scanf("%d",&m); add(i,m); } } printf("%d\n",max_match()); }return 0; }