您的位置:首页 > 其它

【模板】匈牙利算法

2014-02-25 09:34 218 查看
#include<cstring>
#include<vector>
#define MAX_V 80

int V;                               //顶点数
int match[MAX_V];          //所匹配的顶点
bool used[MAX_V];         //DFS中用到 的访问标记
vector<int> G[MAX_V];   //图的邻接表表示

//向图中增加一条边接u和v的边
void add_edge(int u,int v)
{
G[u].push_back(v);
G[v].push_back(u);
}

//通过DFS寻找增广路
bool dfs(int v)
{
used[v]=true;

for(int i=0;i<G[v].size();i++)
{
int u=G[v][i],w=match[u];
if(w<0||(!used[w]&&dfs(w)))
{
match[v]=u;
match[u]=v;
return true;
}
}

return false;
}

//求解二分图的最大匹配
int bipartite_matching()
{
int res=0;

memset(match,-1,sizeof(match));

for(int v=1;v<=V;v++)
{
if(match[v]<0)
{
memset(used,false,sizeof(used));
if(dfs(v))
res++;
}
}

return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: