HDU 1853 Cyclic Tour
HDU_1853
首先,如果要保证图有环,并且环之间没有交点的话,那么必然每个点的出度和入度都应为1,因此我们可以把一个点拆成两个点,分别表示出度及入度,然后去找拆点后构成的二分图的完美匹配。
对于怎么判断原图是否能构成完美匹配,我暂时想到了两个思路:
①在用KM算法之前先用匈牙利算法求最大匹配,如果最大匹配数为N,那么就一定会存在完美匹配。
②我们可以从KM算法的slack变量入手,每一次更新slack,都是在尝试进行新一轮的增广,并且会把更多的原本不在交错树中的点加入进来,当把所有可以加到交错树中点都加入之后,slack就不会再进行更新。换句话讲,如果slack不再更新,那么一定是把所有可以加到交错树中的点都已经加入了,并且这个时候依然不能找到增广路。因此,当slack不再更新的时候我们就可以断定原图不能构成完美匹配了。当然这么做的前提是,我们需要把slack放到for(;;)的里面去,并且每次尝试增广之前,都初始化成INF。
#include<stdio.h>#include<string.h>#define MAXD 110#define INF 1000000000#define MAX 1001int yM[MAXD], visy[MAXD], visx[MAXD];int G[MAXD][MAXD], N, M, A[MAXD], B[MAXD], slack;void init(){int i, a, b, temp; memset(G, 0, sizeof(G));for(i = 0; i < M; i ++) { scanf("%d%d%d", &a, &b, &temp); a --; b --;if(!G[a][b] || MAX - temp > G[a][b]) G[a][b] = MAX - temp; }}int searchpath(int u){int v, temp; visx[u] = 1;for(v = 0; v < N; v ++)if(G[u][v] && !visy[v]) { temp = A[u] + B[v] - G[u][v];if(temp == 0) { visy[v] = 1;if(yM[v] == -1 || searchpath(yM[v])) { yM[v] = u;return 1; } }else if(temp < slack) slack = temp; }return 0;}int EK(){int i, j;for(i = 0; i < N; i ++) { A[i] = 0;for(j = 0; j < N; j ++)if(G[i][j] && G[i][j] > A[i]) A[i] = G[i][j]; } memset(B, 0, sizeof(B)); memset(yM, -1, sizeof(yM));for(i = 0; i < N; i ++) {for(;;) { slack = INF; memset(visx, 0, sizeof(visx)); memset(visy, 0, sizeof(visy));if(searchpath(i))break;if(slack == INF)return 0;for(j = 0; j < N; j ++) {if(visx[j]) A[j] -= slack;if(visy[j]) B[j] += slack; } } }return 1;}void printresult(){int i, res = 0;for(i = 0; i < N; i ++) res += MAX - G[yM[i]][i]; printf("%d\n", res);}int main(){int i, j;while(scanf("%d%d", &N, &M) != EOF) { init();if(EK()) printresult();else printf("-1\n"); }return 0; }
HDU 1853 Cyclic Tour相关推荐
- 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
题目传送门 1 /* 2 KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 3 */ 4 #include <cstdio> 5 #include <cmath ...
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...
- HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流
HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...
- hdu 1853(Cyclic Tour)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 二分匹配,求最小权,只要一开始先取相反数,lx初始化的时候取无穷小...然后KM一敲,最后输出在 ...
- hdu 3746 Cyclic Nacklace
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 思路:KMP中Next数组的应用,求出最小的循环节,题目的意思是只能在字符串的后面上添加新的字符 ...
- HDU 1853 MCMF
题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include < ...
- @hdu - 3746@ Cyclic Nacklace
目录 @description@ @solution@ @code@ @details@ @description@ 给你一个长度为 n 的由小写字母组成的字符串,让你在末尾增加尽量少的字母,使它变为 ...
- 字符串周期--hdu 3746 Cyclic Nacklace
通过这题得出了一个很重要的结论,在用kmp算法求出next数组后,len-next[len]的值就是该字符串的最小循环节,该字符串的其他循环节都是它的倍数,如果len恰好是len-next[len]的 ...
- HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)
题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...
最新文章
- linux下mysql修改root密码
- 探究oracle clob字段是怎样存储的
- MySQL备份工具收集
- PHP中过滤常用标签的正则表达式
- 从0搭建在线聊天室,只需4步!
- Wechat的支付逻辑流程
- 大厂提供什么样的软硬件来吸引人才?
- ML.NET 1.4 发布,跨平台机器学习框架
- 一个表的信息插入到另一个表里面,如果遇到重复的就覆盖
- linux批量过去5小时前文件名,Linux批量修改文件名
- Quartus与modelsim的初级使用教程
- 如何一步步学习到精通JavaScript
- python 执行dos命令_对python中执行DOS命令的3种方法总结
- XJOI一级一段题解(g++,即C++),也可视作C++算法竞赛教程
- 犯了这15个错误,你可能会上征信“黑名单”
- linux自动联想,在联想扩展坞和Linux上自动切换显示
- VideoCapture,mfc读取视频并使用滚动条
- eureka集群高可用配置
- MySQL——客户端工具简介
- 机器学习:从决策树到xgboost
热门文章
- java批量下载文件为zip包
- 获取SpringBean对象工具类
- 基于注解的 AOP 配置
- 软件测试之移动应用的压力和性能测试
- java包和继承的区别,子类和父类在同一个包中继承性
- python编程解决排队问题_并行排队多处理池,python
- 创建ogg文件 c语言,Ogg音频格式文件的样本构造(CVE-2018-5146)
- java类的修饰词有哪些_Java类与对象及访问控制修饰词解析
- mysql duplicate jpa_SpringBoot Jpa 双数据源mysql + oracle + liquibase+参考源码
- sql优化ppt_一款跨平台免费的开源 SQL 编辑器和数据库管理器!