最大匹配问题 POJ 1274
2016-03-10 23:17
309 查看
#include <iostream>
/*POJ 1274
奶牛和牛棚问题,N头奶牛和M个牛棚,每个牛棚只能有一头奶牛产奶
输入每头奶牛愿意产奶的牛棚数和对应的牛棚编号
输出最多分配到的牛棚数*/
const int maxnum =220;
int m,n,Edge[maxnum][maxnum];
int link[maxnum];
bool visited[maxnum];
int match[maxnum];
using namespace std;
bool dfs(int v){
for(int i=1;i<=n;i++){
if(Edge[v][i] !=0 && !visited[i]){
visited[i] = true;
if(link[i] == -1 || dfs(link[i])){
link[i] = v;
return true;
}
}
}
return false;
}
int findMaxMatch(){
int res = 0;
for(int i =1;i<maxnum;i++)
link[i] = -1;
for(int i=1;i<=m;i++){
for(int j=1;j<maxnum;j++)
visited[j] = 0;
if(dfs(i))
res++;
}
return res;
}
int main()
{
int k,v;
cin>>m>>n;
for(int i=1;i<=maxnum;i++){
for(int j=1;j<=maxnum;j++)
Edge[i][j] =0;
}
for(int i=1;i<=m;i++){
cin>>k;
while(k--){
cin>>v;
Edge[i][v] =1;
}
}
cout<<findMaxMatch()<<endl;
/*下面可以找出最大匹配*/
cout<<"最大匹配是:"<<endl;
for(int i=1;i<maxnum;i++)
match[i] =0;
for(int i=1;i<maxnum;i++){
if(link[i] != 0){
match[link[i]] = i;
}
}
for(int i=1;i<maxnum;i++){
if(match[i]!=0){
cout<<i<<"->"<<match[i]<<endl;
}
}
return 0;
}
/*POJ 1274
奶牛和牛棚问题,N头奶牛和M个牛棚,每个牛棚只能有一头奶牛产奶
输入每头奶牛愿意产奶的牛棚数和对应的牛棚编号
输出最多分配到的牛棚数*/
const int maxnum =220;
int m,n,Edge[maxnum][maxnum];
int link[maxnum];
bool visited[maxnum];
int match[maxnum];
using namespace std;
bool dfs(int v){
for(int i=1;i<=n;i++){
if(Edge[v][i] !=0 && !visited[i]){
visited[i] = true;
if(link[i] == -1 || dfs(link[i])){
link[i] = v;
return true;
}
}
}
return false;
}
int findMaxMatch(){
int res = 0;
for(int i =1;i<maxnum;i++)
link[i] = -1;
for(int i=1;i<=m;i++){
for(int j=1;j<maxnum;j++)
visited[j] = 0;
if(dfs(i))
res++;
}
return res;
}
int main()
{
int k,v;
cin>>m>>n;
for(int i=1;i<=maxnum;i++){
for(int j=1;j<=maxnum;j++)
Edge[i][j] =0;
}
for(int i=1;i<=m;i++){
cin>>k;
while(k--){
cin>>v;
Edge[i][v] =1;
}
}
cout<<findMaxMatch()<<endl;
/*下面可以找出最大匹配*/
cout<<"最大匹配是:"<<endl;
for(int i=1;i<maxnum;i++)
match[i] =0;
for(int i=1;i<maxnum;i++){
if(link[i] != 0){
match[link[i]] = i;
}
}
for(int i=1;i<maxnum;i++){
if(match[i]!=0){
cout<<i<<"->"<<match[i]<<endl;
}
}
return 0;
}
相关文章推荐
- JavaScript中Date类的getMonth方法的返回值比实际月份少一的原因之我见
- Easy UI bug:iframe中请求页面而session失效时页面跳转问题
- 堆和栈的区别 (转贴)
- 对引用和指针使用以及函数返回引用和指针类型的理解
- html5
- CSS中可代替cellpadding和cellspacing的属性
- 【考研数学】:函数的间断点分析
- HTML5新特性
- 如何调用EcStore中的API接口
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
- mysql与php之链接数据库
- 杭电oj 2003 求绝对值
- 进程间通信方式
- Python学习笔记(1)——Linux环境
- WinForm窗体继承自定义的模板窗体出错
- SpringMVC的几种返回方式
- CSS重新认识(一)
- 在spark中遇到了奇怪的错误,找到了奇怪的解决方法
- postgresql 视图
- 对百度云盘的评价