/*
* File name : bipartite_graph.cpp
* Function : 二分图的最大匹配 C++实现
* Created on : 2016年6月13日
* Author : beijiwei@qq.com
* Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
任何单位和个人不经本人允许不得用于商业用途
input:
6 5
1 4
1 5
2 5
2 6
3 4
*/
#include <cstdio>
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
#define M 10
int match[M];
int mark[M];
int map[M][M];
int dfs(int x, int n);
int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int sum = 0,vertex_num,edge_num;
cin >> vertex_num >> edge_num;
for (int i = 0; i < vertex_num; i++)//初始化邻接矩阵
{
for (int j = 0; j < vertex_num; j++)
{
map[i][j] = 0;
}
}
for (int i = 0; i < edge_num; i++)// 读入边
{
int t1, t2;
cin >> t1 >> t2;
map[t1][t2] = 1;
map[t2][t1] = 1;
}
for (int i = 0; i < vertex_num; i++)
{
match[i] = 0;
mark[i] = 0;
}
for (int i = 0; i < vertex_num; i++)
{
for (int j = 0; j < vertex_num; j++)
{
mark[j] = 0;
}
if (dfs(i, vertex_num) == 1)
{
sum++;
}
}
cout << "sum=" << sum << endl;
return 0;
}
int dfs(int x, int n)
{
for (int i = 0; i < n; i++)
{
if (mark[i] == 0 && map[x][i] == 1)//从顶点X 开始, 选中顶点X到顶点I 的这条边
{
mark[i] = 1;
if (match[i] == 0 || dfs(match[i], n) == 1)// 如果I 未配对,或者I 的配对者找到了新的配对, 则X和I 配对
{
match[i] = x;
match[x] = i;
return 1;
}
}
}
return 0;
}
二分图的最大匹配 C++实现
最新推荐文章于 2024-08-10 23:04:21 发布