关于匈牙利算法与二分图的小疑惑

Azson 2017-04-03 02:02:19
假如有一个4个顶点的图,边有3->4, 1->3, 2->3
对于这个图的最大匹配不是1吗?
我用匈牙利算法咋算出来2
是我代码有错吗?求解。。。。。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn = 150;
int mat[maxn][maxn];
int gn, gm;
int match[maxn];
bool used[maxn];

bool dfs(int u)
{
for(int v = 1;v <= gm; v++) {
if(!used[v] && mat[u][v]) {
used[v] = true;
if(match[v] < 0 || dfs(match[v])) {
match[v] = u;
return true;
}
}
}
return false;
}

int MaxMatching()
{
int res = 0;
memset(match, -1, sizeof(match));
for(int i = 1;i <= gn;i++) {
memset(used, 0, sizeof(used));
if(dfs(i))
res++;
}
return res;
}

int main()
{
int T, n, m, u, v;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
memset(mat, 0, sizeof(mat));
for(int i = 0;i < m;i++) {
scanf("%d%d", &u, &v);
mat[u][v] = 1;
}
gn = gm = n;
printf("%d\n", n - MaxMatching());
}
return 0;
}
...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Azson 2017-04-25
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
匹配做的都是无向图的。有向图你先要把匹配给定义出来。 最小路径覆盖是转到一个无向二分图上然后再求最大匹配,而不是在原图上。好好看怎么转化的。
似懂非懂的。。。。。
FancyMouse 2017-04-03
  • 打赏
  • 举报
回复
匹配做的都是无向图的。有向图你先要把匹配给定义出来。 最小路径覆盖是转到一个无向二分图上然后再求最大匹配,而不是在原图上。好好看怎么转化的。
Azson 2017-04-03
  • 打赏
  • 举报
回复
突然想到是不是有向图的最大匹配和无向图的最大匹配有区别?求解!

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧