匈牙利算法
2016-01-07 19:36
302 查看
比如有三个人 要选择礼物,每个人都有自己喜欢的礼物,如果拿不到喜欢的礼物,宁愿放弃
int a[4][4] = { {0}, {0, 1,1 }, { 0, 0, 1,1 }, { 0, 1 } }; 第一个人喜欢第1、2个礼物
第二个喜欢第2,3个礼物,第三个人喜欢第一个礼物,问最佳匹配能匹配多少个
算法;
该算法共涉及三个数组:
a[][] 行表示人 、列表示礼物、如果a[i][j]为1,表是该人喜欢该礼物,行、列都从1算起
visit[i]: 表示第i个人是否选到礼物
gift[i]; 表示第i个礼物被谁选走了
步骤
从第一个人开始,a[person][i] :依次查找第一个不为0,目的是找到第person个人喜欢哪个礼物,如果gift【1】没有被别人选走,则把gift【1】设为1,表示第1个礼物被第person个人选走了,返回1
如果gift【1】被别人选走,回溯,让gift【1】这个人重新再找,如果他找到了就可以把现在gift【1】设为person,表示成功 返回1, 否则返回失败
#include <stdio.h>
int visit[4];
int gift[4];
int a[4][4] = { {0}, {0, 1,1 }, { 0, 0, 1,1 }, { 0, 1 } };
int num = 4;
int DFS(int person )
{
int i;
for (i = 1; i < num; ++i)
{
if (a[person][i] != 0 && 0== visit[person])
{
visit[person] = 1;
if (gift[i] == 0 )
{
gift[i] = person;
return 1;
}
else if (DFS(gift[i]))
{
gift[i] = person;//一定要先让第gift【i】个人找到礼物 再把gift[i]重新赋值,之前也不能把gift[i]清0,否则就会进入死循环了
return 1;
}
}
}
return 0;
}
void rset(int a[])
{
int i = 0;
for (i = 0; i < num; i++)
{
a[i] = 0;
}
}
int main(void)
{
int result=0;
int i, m,tmp,k;
m = num;
for (i = 1; i < m; i++)
{
rset(gift); //此处是为了把之前的结构清零,不是特别理解 。。。。。。。。
tmp = DFS(i);
if (0!=tmp)
{
result += tmp;
}
for (k = 1; k < m; k++)
{
printf("%d ", gift[k]);
}
printf("\n");
}
for (i = 1; i < m; i++)
{
printf("%d ",gift[i]);
}
printf("result =%d \n",result);
return 0;
}
int a[4][4] = { {0}, {0, 1,1 }, { 0, 0, 1,1 }, { 0, 1 } }; 第一个人喜欢第1、2个礼物
第二个喜欢第2,3个礼物,第三个人喜欢第一个礼物,问最佳匹配能匹配多少个
算法;
该算法共涉及三个数组:
a[][] 行表示人 、列表示礼物、如果a[i][j]为1,表是该人喜欢该礼物,行、列都从1算起
visit[i]: 表示第i个人是否选到礼物
gift[i]; 表示第i个礼物被谁选走了
步骤
从第一个人开始,a[person][i] :依次查找第一个不为0,目的是找到第person个人喜欢哪个礼物,如果gift【1】没有被别人选走,则把gift【1】设为1,表示第1个礼物被第person个人选走了,返回1
如果gift【1】被别人选走,回溯,让gift【1】这个人重新再找,如果他找到了就可以把现在gift【1】设为person,表示成功 返回1, 否则返回失败
#include <stdio.h>
int visit[4];
int gift[4];
int a[4][4] = { {0}, {0, 1,1 }, { 0, 0, 1,1 }, { 0, 1 } };
int num = 4;
int DFS(int person )
{
int i;
for (i = 1; i < num; ++i)
{
if (a[person][i] != 0 && 0== visit[person])
{
visit[person] = 1;
if (gift[i] == 0 )
{
gift[i] = person;
return 1;
}
else if (DFS(gift[i]))
{
gift[i] = person;//一定要先让第gift【i】个人找到礼物 再把gift[i]重新赋值,之前也不能把gift[i]清0,否则就会进入死循环了
return 1;
}
}
}
return 0;
}
void rset(int a[])
{
int i = 0;
for (i = 0; i < num; i++)
{
a[i] = 0;
}
}
int main(void)
{
int result=0;
int i, m,tmp,k;
m = num;
for (i = 1; i < m; i++)
{
rset(gift); //此处是为了把之前的结构清零,不是特别理解 。。。。。。。。
tmp = DFS(i);
if (0!=tmp)
{
result += tmp;
}
for (k = 1; k < m; k++)
{
printf("%d ", gift[k]);
}
printf("\n");
}
for (i = 1; i < m; i++)
{
printf("%d ",gift[i]);
}
printf("result =%d \n",result);
return 0;
}
相关文章推荐
- 感知器算法(二分类问题)
- [转]eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
- <<浪潮之巅>>阅读笔记二
- 2016-01-07 balloon set_config invoke
- 象牙塔中的2015
- 关于apache的日志配置和模板格式分析
- 欢迎使用CSDN-markdown编辑器
- 25.Android之图像的平移、旋转及缩放学习
- <<浪潮之巅>>阅读笔记一
- OpenSSL应用:Cipher commands详解
- 控制台界面控制(五):文字颜色
- Android webkit,webview和chrome的关系
- 在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法
- Sublime Text2安装Package Control
- iOS_CoreData的使用
- 下次就不要到处搜索路径怎么获得了,to myself
- 代码编写布局的顺序的一点疑惑
- Sql Server查看系统日志
- hdu1002——A + B Problem II
- onActivityResult与activity启动模式singleTask或singleInstance冲突