poj 3041 二分匹配 基础题(整理版:基础知识)匈牙利算法

本文介绍了一种解决最大匹配问题的方法,特别关注于一般图和二分图中的匹配问题。通过实例解释了匹配的概念,并提供了一个C++代码示例来演示如何使用匈牙利算法寻找最大匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通俗易懂的:http://ekumen.iteye.com/blog/265336
     模板:http://chhaj5236.blog.163.com/blog/static/1128810812009910102617216/
Ford-Fulkerson求解最大流 Edmonds-Karp算法:http://chhaj5236.blog.163.com/blog/static/112881081200982835124243/

说下什么叫匹配,以及和匹配相关的一些概念,匹配就是一些边的集合,这些边没有公共顶点,举个例子,就是飞机场有n个驾驶员,有一部分驾驶员之间是互相认识的,飞机需要两个互相认识的驾驶员才能起飞,一个驾驶员只能上一个飞机,求能起飞的最大飞机架数,那么我们只要让认识的飞行员之间相互连边,然后就成了选出最多的不相交的边了,就成了最大匹配,那么由于这个图是一般图,需要用带花树算法,很复杂,应用就不多做要求,但是,如果人里面有一些正驾驶,副驾驶,飞机需要一正一副而且认识才能起飞,显然就成为了一个二分图的最大匹配问题

#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn=501;
int match[maxn];
int map[maxn][maxn];
bool v[maxn];
int n,m;
int dfs(int p){
  for(int i=1;i<=n;i++){
      if(map[p][i]&&!v[i]){
           v[i]=1;
           if(match[i]==-1||dfs(match[i])){
                match[i]=p;
                return 1;                                
           }                     
      }        
  }
  return 0;//莫漏 
}
int Hungry(){
   int i;
   int ans=0;
   for(i=1;i<=n;i++){
       memset(v,0,sizeof(v));
       if(dfs(i))
          ans++;                  
   }    
   return ans;
}
int main(){
    int i,j,k;
    cin>>n>>k;
    for(m=1;m<=k;m++){
       cin>>i>>j;
       map[i][j]=1;                  
    }
    memset(match,-1,sizeof(match));
    cout<<Hungry()<<endl;
    system("PAUSE");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值