HDU 2064 二分图 匈牙利算法 零基本教学
2015-11-08 15:33
369 查看
在从来没有接触过图论的基础上学习了匈牙利算法和二分图
网上的资料大多需要知道一点图论的基本知识,为了和我一样的人能够看懂,就写一下零基础的。
先要看明白匈牙利算法,下面这篇文章,小白也能看懂。
http://blog.csdn.net/dark_scope/article/details/8880547
看完之后再看这个代码,整个代码就是按照上面那篇文章的方式,一模一样的来进行计算的
网上的资料大多需要知道一点图论的基本知识,为了和我一样的人能够看懂,就写一下零基础的。
先要看明白匈牙利算法,下面这篇文章,小白也能看懂。
http://blog.csdn.net/dark_scope/article/details/8880547
看完之后再看这个代码,整个代码就是按照上面那篇文章的方式,一模一样的来进行计算的
#include<string.h> #include<iostream> #include<algorithm> #include<stdlib.h> #include<cstdio> using namespace std; bool vis[510]; bool lj[510][510];//记录某男生和某女生的连接,若可以连接则为1,反之为0 int map[510];//记录某个男生匹配了某个女生。如map[3]=1 即第三个男生匹配了第一个女生 int m,n; int find(int p) { int i,j; for(i = 1; i <= n; i++) { if(!vis[i]&&lj[p][i]) { vis[i] = 1; if(!map[i] || find(map[i])) { map[i] = p; return 1; } } } return 0; } int main() { int k,a,b,i,j,ans; while(~scanf("%d",&k) && k) { ans = 0;//用于记录总的匹配对数 memset(lj,0,sizeof(lj)); memset(map,0,sizeof(map)); scanf("%d%d",&m,&n); while(k--)// { scanf("%d%d",&a,&b); lj[a][b] = 1; } for(i = 1; i <= m; i++)//从第一个女生还是索引 { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- Tomcat之——添加CROS跨源请求
- nginx和lua开发二
- Android中常用对话框
- spring的bean配置文件中p:
- 解决Mysql乱码问题
- REM实战
- linux命令-vim命令模式
- [HDOJ4081]Qin Shi Huang's National Road System
- 【Java高级】反射+工厂模式+属性文件的实例应用
- 接口
- Linux之MariaDB基础总结(一)
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- 杭电2571 命运
- 索引(index)_普通索引、唯一索引和复合索引.索引查询
- Ajax上传文件
- poj 2074 Line of Sight (计算几何,细节题)
- Study of the Symbolic Exection
- Linux下安装nexus
- 20135321余佳源——信息安全系统设计基础第九周学习总结
- sed命令的用法