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相关推荐

  1. 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour

    题目传送门 1 /* 2 KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 3 */ 4 #include <cstdio> 5 #include <cmath ...

  2. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  3. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...

  4. hdu 1853(Cyclic Tour)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 二分匹配,求最小权,只要一开始先取相反数,lx初始化的时候取无穷小...然后KM一敲,最后输出在 ...

  5. hdu 3746 Cyclic Nacklace

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 思路:KMP中Next数组的应用,求出最小的循环节,题目的意思是只能在字符串的后面上添加新的字符 ...

  6. HDU 1853 MCMF

    题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include < ...

  7. @hdu - 3746@ Cyclic Nacklace

    目录 @description@ @solution@ @code@ @details@ @description@ 给你一个长度为 n 的由小写字母组成的字符串,让你在末尾增加尽量少的字母,使它变为 ...

  8. 字符串周期--hdu 3746 Cyclic Nacklace

    通过这题得出了一个很重要的结论,在用kmp算法求出next数组后,len-next[len]的值就是该字符串的最小循环节,该字符串的其他循环节都是它的倍数,如果len恰好是len-next[len]的 ...

  9. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

最新文章

  1. linux下mysql修改root密码
  2. 探究oracle clob字段是怎样存储的
  3. MySQL备份工具收集
  4. PHP中过滤常用标签的正则表达式
  5. 从0搭建在线聊天室,只需4步!
  6. Wechat的支付逻辑流程
  7. 大厂提供什么样的软硬件来吸引人才?
  8. ML.NET 1.4 发布,跨平台机器学习框架
  9. 一个表的信息插入到另一个表里面,如果遇到重复的就覆盖
  10. linux批量过去5小时前文件名,Linux批量修改文件名
  11. Quartus与modelsim的初级使用教程
  12. 如何一步步学习到精通JavaScript
  13. python 执行dos命令_对python中执行DOS命令的3种方法总结
  14. XJOI一级一段题解(g++,即C++),也可视作C++算法竞赛教程
  15. 犯了这15个错误,你可能会上征信“黑名单”
  16. linux自动联想,在联想扩展坞和Linux上自动切换显示
  17. VideoCapture,mfc读取视频并使用滚动条
  18. eureka集群高可用配置
  19. MySQL——客户端工具简介
  20. 机器学习:从决策树到xgboost

热门文章

  1. java批量下载文件为zip包
  2. 获取SpringBean对象工具类
  3. 基于注解的 AOP 配置
  4. 软件测试之移动应用的压力和性能测试
  5. java包和继承的区别,子类和父类在同一个包中继承性
  6. python编程解决排队问题_并行排队多处理池,python
  7. 创建ogg文件 c语言,Ogg音频格式文件的样本构造(CVE-2018-5146)
  8. java类的修饰词有哪些_Java类与对象及访问控制修饰词解析
  9. mysql duplicate jpa_SpringBoot Jpa 双数据源mysql + oracle + liquibase+参考源码
  10. sql优化ppt_一款跨平台免费的开源 SQL 编辑器和数据库管理器!