用匈牙利算法求二分图的最大匹配
来源:互联网 发布:软件项目经理招聘要求 编辑:程序博客网 时间:2024/05/17 03:58
1, 用匈牙利算法求二分图的最大匹配
算法轮廓:
(1)置M为空
(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替M
(3)重复(2)操作直到找不出增广路径为止
程序文件夹:22222
#include < iostream >
#include < fstream >
using namespace std;
const int MAXN = 100 ;
int uN, vN; // u,v数目
bool g[MAXN][MAXN]; // g[i][j] 表示 xi与yj相连
int xM[MAXN], yM[MAXN]; // 输出量
bool chk[MAXN]; // 辅助量 检查某轮 y[v]是否被check
bool SearchPath( int u)
{
int v;
for (v = 0 ; v < vN; v ++ )
{
if (g[u][v] && ! chk[v])
{
chk[v] = true ;
if (yM[v] == - 1 || SearchPath(yM[v]))
{
yM[v] = u;
xM[u] = v;
return true ;
}
}
}
return false ;
}
int MaxMatch()
{
int u;
int ret = 0 ;
memset(xM, - 1 , sizeof (xM));
memset(yM, - 1 , sizeof (yM));
for (u = 0 ; u < uN; u ++ )
{
if (xM[u] == - 1 )
{
memset(chk, false , sizeof (chk));//Sets buffers to a specified character.
if (SearchPath(u)) ret ++ ;
}
}
return ret;
}
int main()
{
int i, k;
int tU, tV;
// ifstream cin( " test.txt " );
cin >> uN >> vN >> k;
memset(g, false , sizeof (g));
for (i = 0 ; i < k; i ++ )
{
cin >> tU >> tV;
g[tU][tV] = true ;
}
int M = MaxMatch();
cout << " Total Match: " << M << endl;
for (i = 0 ; i < MAXN; i ++ )
if (xM[i] != - 1 )
cout << i << ' ' << xM[i] << endl;
system( " pause " );
return 0 ;
}
/**/ /* **********
test data:
3 3 3
1 1
1 0
2 2
********** */
算法轮廓:
(1)置M为空
(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替M
(3)重复(2)操作直到找不出增广路径为止
程序文件夹:22222
#include < iostream >
#include < fstream >
using namespace std;
const int MAXN = 100 ;
int uN, vN; // u,v数目
bool g[MAXN][MAXN]; // g[i][j] 表示 xi与yj相连
int xM[MAXN], yM[MAXN]; // 输出量
bool chk[MAXN]; // 辅助量 检查某轮 y[v]是否被check
bool SearchPath( int u)
{
int v;
for (v = 0 ; v < vN; v ++ )
{
if (g[u][v] && ! chk[v])
{
chk[v] = true ;
if (yM[v] == - 1 || SearchPath(yM[v]))
{
yM[v] = u;
xM[u] = v;
return true ;
}
}
}
return false ;
}
int MaxMatch()
{
int u;
int ret = 0 ;
memset(xM, - 1 , sizeof (xM));
memset(yM, - 1 , sizeof (yM));
for (u = 0 ; u < uN; u ++ )
{
if (xM[u] == - 1 )
{
memset(chk, false , sizeof (chk));//Sets buffers to a specified character.
if (SearchPath(u)) ret ++ ;
}
}
return ret;
}
int main()
{
int i, k;
int tU, tV;
// ifstream cin( " test.txt " );
cin >> uN >> vN >> k;
memset(g, false , sizeof (g));
for (i = 0 ; i < k; i ++ )
{
cin >> tU >> tV;
g[tU][tV] = true ;
}
int M = MaxMatch();
cout << " Total Match: " << M << endl;
for (i = 0 ; i < MAXN; i ++ )
if (xM[i] != - 1 )
cout << i << ' ' << xM[i] << endl;
system( " pause " );
return 0 ;
}
/**/ /* **********
test data:
3 3 3
1 1
1 0
2 2
********** */
0 0
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- (转载)用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 用匈牙利算法求二分图的最大匹配
- 匈牙利算法 求二分图最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配/匈牙利算法模板
- Invalidate函数
- /dev/mem
- Highcharts封装
- android例子下载
- Ubuntu vimrc配置文件 vim 设置行号,缩进距等
- 用匈牙利算法求二分图的最大匹配
- Android异步加载全解析之引入一级缓存
- 80端口被占用问题解决
- 【笔记】多线程操作Oracle数据库的一个BUG
- JS如何判断包括IE11在内的IE浏览器
- 大小不固定的图片,多行文字水平垂直居中
- 【nginx+memcached+tomcat集群 session共享完整版】
- 第三章第七题(5)
- 黑马程序员_7K月薪面试题交通灯管理系统