D25 二分图最大匹配 匈牙利算法

视频链接:https://www.bilibili.com/video/BV1GW4y1z7xk/

// Luogu P3386 【模板】二分图最大匹配
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=505,M=100010;
int n,m,k,a,b,ans;
struct edge{int v,ne;}e[M];
int h[N],idx;
int vis[N],match[N];

void add(int a,int b){
  e[++idx]={b,h[a]};
  h[a]=idx;
}
bool dfs(int u){
  for(int i=h[u];i;i=e[i].ne){
    int v=e[i].v; //妹子
    if(vis[v]) continue;
    vis[v]=1; //先标记这个妹子
    if(!match[v]||dfs(match[v])){
      match[v]=u; //配成对
      return 1;
    }
  }
  return 0;
}
int main(){
  cin>>n>>m>>k;
  for(int i=0;i<k;i++)
    cin>>a>>b, add(a,b);
  for(int i=1;i<=n;i++){
    memset(vis,0,sizeof vis);
    if(dfs(i)) ans++;
  }
  cout<<ans;
  return 0;
}

 

// n个不同点的二分图
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1010,M=200010;
int n,m,k,a,b,ans;
struct edge{int v,ne;}e[M];
int h[N],idx;
int vis[N],match[N];

void add(int a,int b){
  e[++idx]={b,h[a]};
  h[a]=idx;
}
bool dfs(int u){
  for(int i=h[u];i;i=e[i].ne){
    int v=e[i].v;
    if(vis[v]) continue;
    vis[v]=1;
    if(!match[v]||dfs(match[v])){
      match[v]=u; match[u]=v;
      return 1;
    }
  }
  return 0;
}
int main(){
  cin>>n>>m>>k;
  for(int i=0;i<k;i++)
    cin>>a>>b,add(a,b+n),add(b+n,a);
  for(int i=1;i<=n+m;i++){
    if(!match[i]){
      memset(vis,0,sizeof vis);
      if(dfs(i)) ans++;
    }
  }
  cout<<ans;
  return 0;
}

 

posted @ 2022-06-28 09:13  董晓  阅读(766)  评论(0编辑  收藏  举报