在复杂网络中,二部图是被经常使用到的一种分析问题的方法,本文将笔者最近学习的二部图知识汇总整理一下,以供交流学习。
二部图的最大匹配有三种基本的算法:1)BFS;2)DFS;3)Hopcroft-Karp算法
1)BFS;2)DFS;
#include <iostream>
#include <fstream>
#include<string>
#define MAXN 10000
using namespace std;
int mk[MAXN]; //mk[i]=0表示未访问过,为1表示访问过
int nx=MAXN, ny=MAXN; //X,Y集合中顶点的个数
int g[MAXN][MAXN]; //邻接矩阵,g[i][j]为1,表示Xi,Yj有边相连
int cx[MAXN],cy[MAXN]; //cx[i]最终求得的最大匹配中与Xi匹配的Y顶点,cy[i]同理
int pred[MAXN]; //用来记录交错轨的,同时也用来记录Y集合中的顶点是否被遍历过
int queue[MAXN]; //实现BFS搜索时,用到的队列(用数组模拟)
int read() //读取数据,数组存储
{
ifstream cin("ER_data.txt",ios::in);
//ifstream cin("test.txt",ios::in);
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
g[i][j]=0;
int x,y;
while(cin>>x>>y)
g[x][y]=1;
cin.close();
return 0;
}
int path (int u)
{
for (int v=0; v <ny; v++ ) //考虑所有Yi顶点v
{
if (g[u][v]&&!mk[v]) //v与u邻接,且没有访问过
{
mk[v]=1; //访问v
//如果v没有匹配;或者v已经匹配了,但从cy[v]出发可以找到一条增广路
//注意,前一个条件成立,则不会递归调用
if (cy[v]==-1||path ( cy[v]) )
{
cx[u]=v;
cy[v]=u;
retu