标签:acm algorithm poj 二分图 匈牙利算法
| 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;
}POJ_1274_The Perfect Stall(二分图匹配)
标签:acm algorithm poj 二分图 匈牙利算法
原文地址:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/45564853