杭电ACM1150
2015-11-05 14:41
204 查看
本周训练的内容是二分图,匈牙利算法。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150
题目大意:机器调度。一项任务可以由机器A来完成,也可以由机器B来完成,给出一系列任务,可以调整完成每一项任务的机器,但是每次调整都需要重启机器,这就要消耗时间,求完成所有任务的最短时间。
思路分析:典型的匈牙利算法问题,直接用匈牙利算法解决。
关于匈牙利算法的讲解,感觉这一篇博客比较透彻、易懂,地址链接如下:http://jetmuffin.github.io/2015/11/01/二分图匹配-匈牙利算法/
注意:题目说初始状态为0,所以如果一个任务有一点为0的边不要添加,因为不需要代价。因为这个WA了好多次……
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150
题目大意:机器调度。一项任务可以由机器A来完成,也可以由机器B来完成,给出一系列任务,可以调整完成每一项任务的机器,但是每次调整都需要重启机器,这就要消耗时间,求完成所有任务的最短时间。
思路分析:典型的匈牙利算法问题,直接用匈牙利算法解决。
关于匈牙利算法的讲解,感觉这一篇博客比较透彻、易懂,地址链接如下:http://jetmuffin.github.io/2015/11/01/二分图匹配-匈牙利算法/
注意:题目说初始状态为0,所以如果一个任务有一点为0的边不要添加,因为不需要代价。因为这个WA了好多次……
//AC代码: #include <iostream> #include <string.h> using namespace std; #define MAX 120 bool used[MAX]; int linked[MAX]; int g[MAX][MAX]; int un,vn; bool dfs(int u) { int v; for(v=0;v<vn;v++) { if(g[u][v]&&!used[v]) { used[v] = true; if(linked[v]==-1||dfs(linked[v])) { linked[v] = u; return true; } } } return false; } int hungry() { int res = 0; int u; memset(linked,-1,sizeof(linked)); for(u=0;u<un;u++) { memset(used,0,sizeof(used)); if(dfs(u))res++; } return res; } int main() { int k; int i,u,v; while(cin>>un) { if(un==0)break; memset(g,0,sizeof(g)); cin>>vn>>k; while(k--) { cin>>i>>u>>v; if(u>0&&v>0)g[u][v] = 1; } cout<<hungry()<<endl; } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例