#include "iostream"
#include "stack"
#include "vector"
#include "string.h"
#define min(x, y) x < y ? x : y
using namespace std;
int V; //顶点数
const int MAX_V = 100;
vector<int> G[MAX_V]; //图的邻接表
int visit[MAX_V]; //访问标记
int match[MAX_V];
void addEdge(int from, int to)
{
G[from].push_back(to);
G[to].push_back(from);
}
bool dfs(int u)
{
visit[u] = 1;
for(int i=0; i<G[u].size(); i++)
{
int v = G[u][i];
int w = match[v];
if(w < 0 || !visit[w] && dfs(w)) //如果v没有匹配,或可以更改v所匹配顶点的匹配
{
match[u] = v;
match[v] = u;
return true;
}
}
return false;
}
int bipartite_match()
{
int k = 0;
memset(match, -1, sizeof(match));
for(int i=0; i<V; i++)
{
if(match[i] < 0)
{
memset(visit, 0, sizeof(visit));
if(dfs(i))
k++;
}
}
return k;
}
int main()
{
//u1, u2, u3, v1, v2, v3
//0, 1, 2, 3, 4, 5
V = 6;
addEdge(0, 3);
addEdge(0, 4);
addEdge(1, 3);
addEdge(1, 5);
addEdge(2, 4);
cout << "二分图最大匹配数为:" << bipartite_match() << endl;
return 0;
}
二分图匹配
最新推荐文章于 2023-07-26 11:40:26 发布