二分图匹配模板(dfs+bfs)
2017-11-26 21:45
393 查看
dfs版:
[cpp] view plain copy print?
bool dfs(int u)
{
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(!vis[v]) {
vis[v] = true;
if(my[v] == -1 || dfs(my[v])) {
my[v] = u;
mx[u] = v;
return true;
}
}
}
return false;
}
int hungary()
{
int ret = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
for(int i = 1; i <= X; i++) {
if(mx[i] == -1) {
memset(vis, 0, sizeof(vis));
if(dfs(i)) ret++;
}
}
return ret;
}
bfs版:
[cpp] view plain copy print?
bool bfs(int st)
{
queue <int> q;
q.push(st);
pre[st] = -1;
bool flag = false;
while(!q.empty() && !flag) {
int u = q.front(); q.pop();
for(int i = head[u]; ~i && !flag; i = e[i].next) {
int v = e[i].v;
if(vis[v] != st) {
vis[v] = st;
q.push(my[v]);
if(~my[v]) pre[my[v]] = u;
else {
int a = u, b = v;
flag = true;
while(~a) {
int t = mx[a];
mx[a] = b;
my[b] = a;
a = pre[a];
b = t;
}
}
}
}
}
return mx[st] != -1;
}
int hungary()
{
int ret = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
memset(vis, -1, sizeof(vis));
for(int i = 1; i <= nX; i++) {//number from 1
if(mx[i] == -1) {
if(bfs(i)) ret++;
}
}
return ret;
}
[cpp] view plain copy print?
bool dfs(int u)
{
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(!vis[v]) {
vis[v] = true;
if(my[v] == -1 || dfs(my[v])) {
my[v] = u;
mx[u] = v;
return true;
}
}
}
return false;
}
int hungary()
{
int ret = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
for(int i = 1; i <= X; i++) {
if(mx[i] == -1) {
memset(vis, 0, sizeof(vis));
if(dfs(i)) ret++;
}
}
return ret;
}
bfs版:
[cpp] view plain copy print?
bool bfs(int st)
{
queue <int> q;
q.push(st);
pre[st] = -1;
bool flag = false;
while(!q.empty() && !flag) {
int u = q.front(); q.pop();
for(int i = head[u]; ~i && !flag; i = e[i].next) {
int v = e[i].v;
if(vis[v] != st) {
vis[v] = st;
q.push(my[v]);
if(~my[v]) pre[my[v]] = u;
else {
int a = u, b = v;
flag = true;
while(~a) {
int t = mx[a];
mx[a] = b;
my[b] = a;
a = pre[a];
b = t;
}
}
}
}
}
return mx[st] != -1;
}
int hungary()
{
int ret = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
memset(vis, -1, sizeof(vis));
for(int i = 1; i <= nX; i++) {//number from 1
if(mx[i] == -1) {
if(bfs(i)) ret++;
}
}
return ret;
}
相关文章推荐
- BFSDFS模板
- BFS/DFS 模板 代码
- BFS+DFS---简介与模板
- 模板:HDU 1242: Rescue: (BFS DFS)
- BFS() DFS() 模板
- DFS&&BFS模板
- poj-3083-烦人复杂搜索+bfs,dfs模板
- DFS、BFS和Backtracking模板
- 图的遍历(bfs+dfs)模板
- 模板--bfs和dfs
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。+string +dfs +bfs等重要算法
- BFS+DFS 模板
- BFS/DFS 模板 代码
- dfs,bfs的二分匹配模板(模板题hdu1150)
- DFS和BFS模板
- 二分图匹配匈牙利算法(DFS, BFS两种实现模板)
- BFS和DFS模板
- dfs bfs模板
- BFS&&DFS模板
- Rescue 3解法:(1.DFS 2. BFS 3.BFS+优先队列模板)