博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
匈牙利算法(一种用增广路径求二分图最大匹配的算法)
阅读量:6454 次
发布时间:2019-06-23

本文共 985 字,大约阅读时间需要 3 分钟。

hot3.png

格式说明
输入格式:
第1行3个整数,V1,V2的节点数目n1,n2,G的边数m
剩下m行,每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连
输出格式:
1个整数ans,代表最大 数
邻接矩阵-C
#include <stdio.h>
#include <string.h>
int n1,n2,m,ans;
int result[101]; //记录V2中的点 的点的编号
bool state [101]; //记录V2中的每个点是否被搜索过
bool data[101][101];//邻接矩阵 true代表有边相连
void init()
{
int t1,t2;
memset(data,0,sizeof(data));
memset(result,0,sizeof(result));
ans = 0;
scanf("%d%d%d",&n1,&n2,&m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d",&t1,&t2);
data[t1][t2] = true;
}
return;
}
bool find(int a)
{
for (int i = 1; i <= n2; i++)
{
if (data[a][i] == 1 && !state[i]) //如果节点i与a相邻并且未被查找过
{
state[i] = true; //标记i为已查找过
if (result[i] == 0 //如果i未在前一个 M中
|| find(result[i])) //i在 M中,但是从与i相邻的节点出发可以有
{
result[i] = a; //记录查找成功记录
return true; //返回查找成功
}
}
}
return false;
}
int main()
{
init();
for (int i = 1; i <= n1; i++)
{
memset(state,0,sizeof(state)); //清空上次搜索时的标记
if (find(i)) ans++; //从 i尝试扩展
}
printf("%d\n",ans);
return 0;
}

转载于:https://my.oschina.net/wizardpisces/blog/144601

你可能感兴趣的文章
IEnumerable<T>
查看>>
IntelliJ IDEA 注册码
查看>>
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>
switch函数——Gevent源码分析
查看>>
Spring MVC简单原理
查看>>
DynamoDB Local for Desktop Development
查看>>
ANDROID的SENSOR相关信息
查看>>
laravel 使用QQ邮箱发送邮件
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
thymeleaf 中文乱码问题
查看>>
(转)CSS浮动(float,clear)通俗讲解
查看>>
os.walk函数
查看>>
[Unity3d]DrawCall优化手记
查看>>
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
查看>>
SQL Serever学习7——数据表2
查看>>
洛谷——P2404 自然数的拆分问题
查看>>