APTX Blog

A Moe Blog Set Up By APTX

#C/C++#二分图匹配匈牙利算法模板(邻接表/邻接矩阵)

洛谷:P3386

题目背景

二分图

题目描述

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

输入输出格式

输入格式:

第一行,n,m,e

第二至e+1行,每行两个正整数u,v,表示u,v有一条连边

输出格式:

共一行,二分图最大匹配

输入输出样例

输入样例#1:

1 1 1
1 1

输出样例#1:

1

邻接矩阵(老码风)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;

const int maxn(1005);
int ans;
int n,m,e;
bool vis[maxn][maxn];
bool use[maxn];
int matched[maxn];

inline bool dfs(int);

int main(){
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1;i<=e;++i){
        int x,y;
        scanf("%d%d",&x,&y);
        vis[x][y]=true;
    }
    for(int i=1;i<=n;++i){
        memset(use,false,sizeof use);
        if(dfs(i)) ans++;
    } 
    printf("%d\n",ans);
    return 0;
} 

inline bool dfs(int x){
    for(int i=1;i<=m;++i){
        if(vis[x][i]&&!use[i]){
            use[i]=true;
            if(!matched[i]||dfs(matched[i])){
                matched[i]=x;
                return true;
            }
        }
    }
    return false;
}

邻接矩阵(新码风)

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAXM = 1e8;
const int MAXN = 1005;

struct node {
	int to,next;
};

node e[MAXM];

bool used[MAXN];
int head[MAXN],cnt,n,m,ee,Ans,Matched[MAXN];

void add(int from,int to) {
	e[++cnt].next = head[from];
	e[cnt].to = to;
	head[from] = cnt;
}

inline bool dfs(int u) {
	for(int i = head[u];i;i = e[i].next) {
		int v = e[i].to;
		if(!used[v]) {
			used[v] = true;
			if(!Matched[v] || dfs(Matched[v])) {
				Matched[v] = u;
				return true;
			}
		}
	}
	return false;
}

int main() {
	cin >> n >> m >> ee;
	for(int i = 1;i <= ee;++i) {
		int from,to;
		cin >> from >> to;
		if(from > n or to > m) continue;
		add(from,to);
	}
	for(int i = 1;i <= n;++i) {
		memset(used,false,sizeof used);
		if(dfs(i)) Ans++;
	}
	cout << Ans << endl;
	return 0;
}

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注