匈牙利算法
来源:互联网 发布:windows 私有云 编辑:程序博客网 时间:2024/05/07 00:39
匈牙利算法
刚刚复习了匈牙利算法。匈牙利算法代码非常短,但是有很多需要注意的地方。
int find(int u)
{
int j = edge.head[u];
while(j)
{
int v = edge.e[j];
if (!vis[v])
{
vis[v] = 1;
if (result[v] == 0 || find(result[v])){
result[v] = u;
result[u] = v;
return 1;
}
}
j = edge.next[j];
}
return 0;
}
- 匈牙利算法中find返回True,代表找到一条增广路,匹配数+1,并且原来已经匹配的节点依然处于匹配的状态(可能边不同),两个未匹配的节点变为匹配状态,其中包括第一次调用find时作为参数传入的节点。
- 匈牙利算法可以在不知道二部图的情况下使用,只要维护好所有节点的result,即所有节点的匹配状态。因为二部图中匹配时所有的节点都等价,所以不管从二部图的哪一边寻找增广路都是可以的。
- 递归搜索时一旦出现了return 1,那么就会沿着调用的路径一直return 1直到退出递归。因此vis[v]=1不需要还原。一个节点最多只会被搜索一次,当它的result改变时一定是第一次搜索到这个节点。
hiho一下 第三十四周
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int N = 2*1005;
const int M = 2*5005;
class my_edge
{
public:
int tot;
int head[N],next[M],e[M];
my_edge();
void addedge(int,int);
};
int n,m;
int result[N],vis[N];
my_edge edge;
void init();
int find(int);
void solve();
int main()
{
init();
solve();
return 0;
}
my_edge::my_edge(){
tot = 0;
memset(head,0,sizeof(head));
}
void my_edge::addedge(int u,int v)
{
tot++;
next[tot] = head[u];head[u] = tot; e[tot] = v;
tot++;
next[tot] = head[v];head[v] = tot; e[tot] = u;
}
void init()
{
scanf("%d %d",&n,&m);
while (m--)
{
int p,q;
scanf("%d %d",&p,&q);
edge.addedge(p,q);
}
}
void solve()
{
int ans = 0;
for (int i = 1; i <= n; i++)
{
memset(vis,0,sizeof(vis));
if (result[i] == 0 && find(i))
{
ans ++;
}
}
cout << ans << endl;
}
int find(int u)
{
int j = edge.head[u];
while(j)
{
int v = edge.e[j];
if (!vis[v])
{
vis[v] = 1;
if (result[v] == 0 || find(result[v])){
result[v] = u;
result[u] = v;
return 1;
}
}
j = edge.next[j];
}
return 0;
}
0 0
- 匈牙利算法
- 匈牙利算法!!!
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- 匈牙利算法
- UVA 315 Network(无向图求割点)
- a different object with the same identifier value was already associated withthe session异常解决方案
- servlet初始化参数和上下文初始化参数
- 使用scrapy进行大规模抓取
- 创建自己的YUM仓库
- 匈牙利算法
- UVA 10491 Cows and Cars(概率)
- UVa-1368 - DNA Consensus String
- 自定义ToggleButton的样式
- UVa-202 - Repeating Decimals
- UVa-10340 - All in All
- 【hibernate框架】练习-学生、课程、分数的设计(重要)
- 2015计划
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活