这题只要想到是最优完备匹配就行了;

题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数;

问如何匹配得出最大值;

思路:建图,套模板。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define CLR(arr, what) memset(arr, what, sizeof(arr))
  7. #define maxn 305
  8. #define INF (1<<30)-1
  9. int g[maxn][maxn];
  10. int lx[maxn],ly[maxn],match[maxn];
  11. bool visx[maxn],visy[maxn];
  12. int slack[maxn];
  13. int n,m;
  14. char str[maxn][10001];
  15. bool dfs(int cur){
  16. visx[cur] = true;
  17. for(int y=1;y<=m;y++){
  18. if(visy[y]) continue;
  19. int t=lx[cur]+ly[y]-g[cur][y];
  20. if(t==0){
  21. visy[y] = true;
  22. if(match[y]==-1||dfs(match[y])){
  23. match[y] = cur;
  24. return true;
  25. }
  26. }
  27. else if(slack[y]>t){
  28. slack[y]=t;
  29. }
  30. }
  31. return false;
  32. }
  33. int KM(){
  34. CLR(match,-1);
  35. CLR(ly,0);;
  36. for(int i=1 ;i<=n;i++){
  37. lx[i]=-INF;
  38. for(int j=1;j<=m;j++)
  39. if(g[i][j]>lx[i]) lx[i]=g[i][j];
  40. }
  41. for(int x=1;x<=n;x++){
  42. for(int i=1;i<=m;i++) slack[i]=INF;
  43. while(true){
  44. CLR(visx,false);
  45. CLR(visy,false);
  46. if(dfs(x)) break;
  47. int d=INF;
  48. for(int i=1;i<=m;i++){
  49. if(!visy[i]&&d>slack[i]) d=slack[i];
  50. }
  51. for(int i=1;i<=n;i++){
  52. if(visx[i]) lx[i]-=d;
  53. }
  54. for(int i=1;i<=m;i++){
  55. if(visy[i]) ly[i]+=d;
  56. else slack[i]-=d;
  57. }
  58. }
  59. }
  60. int result = 0;
  61. for(int i = 1; i <=m; i++)
  62. if(match[i]!=-1)
  63. result += g[match[i]][i];
  64. return result;
  65. }
  66.  
  67. int solve(int i,int j)
  68. {
  69. if(i==j) return 0;
  70. int len1=strlen(str[i]);
  71. int len2=strlen(str[j]);
  72.  
  73. int P = len1-1;
  74. int Q = 0;
  75.  
  76. while(P >= 0 && Q < len2 && str[i][P] == str[j][Q])
  77. {
  78. P--;
  79. Q++;
  80. }
  81. return Q;
  82.  
  83. }
  84. int main(){
  85. while(scanf("%d",&n)!=EOF){
  86. CLR(g,0);
  87. m=n;
  88. for(int i=1;i<=n;i++)
  89. {
  90. scanf("%s",str[i]);
  91. }
  92. for(int i=1;i<=n;i++)
  93. {
  94. for(int j=1;j<=n;j++)
  95. {
  96. int k=solve(i,j);
  97. g[i][j]=k;
  98. }
  99. }
  100. printf("%d\n",KM());
  101. }
  102. return 0;
  103. }

hdu 3722 二分图 最优完备匹配 KM算法的更多相关文章

  1. 二分图最大权值匹配 KM算法 模板

    KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...

  2. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  3. 【模板】二分图最大权完美匹配KM算法

    hdu2255模板题 KM是什么意思,详见百度百科. 总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3). 给张图. 二分图有了边权,求最大匹配下的最大权值. 所以该怎么做呢?对啊 ...

  4. 二分图最大权完美匹配KM算法

    KM算法二分图 KM求得二分图与普通二分图的不同之处在于:此二分图的每条边(男生女生)上都附了权值(好感度).然后,求怎样完美匹配使得权值之和最大. 这,不止一般的麻烦啊. 可以通过一个期望值来求. ...

  5. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. 二分图最大权匹配——KM算法

    前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...

  7. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  8. Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)

    奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...

  9. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

随机推荐

  1. 利用python发送邮件

    找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...

  2. PDF修改器

    亲测可用的绿色版PDF修改器供大家分享使用 下载地址:http://pan.baidu.com/s/1pLPnhQb

  3. Java微信公众平台开发之OAuth2.0网页授权

    根据官方文档点击查看在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修 ...

  4. web添加第三方应用,前端解决跨域问题的8种方案

    应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1. 注册成为QQ互联平台开发者,http://connect.qq.com/ 2. 准备一个可访问的域名,如dev.foo.com 3 ...

  5. URL的概念

      URL(Uniform Resource Locator)直接翻译为"统一资源定位符" URL的作用:描述一个在网络上的资源   schema://host[:port#]/path/.../[? ...

  6. C语言开篇

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具. 1.小程序test_gets.c #i ...

  7. IPython+:一个交互式计算和开发环境

    一. IPython基础 代码自动补全:Tab键 可补全内容包括:变量名.函数名.成员变量函数.目录文件 内省(Itrospection) 在变量名之前或之后加上问号(?),这样可以显示这个对象的相关 ...

  8. vue.js开发环境搭建以及创建一个vue实例

    Vue.js 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 在使用 vue.js ...

  9. 前端应该知道的Web Components

    前端组件化的痛点 在前端组件化横行的今天,确实极大的提升了开发效率.不过有一个问题不得不被重视,拟引入的这些html.css.js代码有可能对你的其他代码造成影响. 虽然我们可以通过命名空间.闭包等一 ...

  10. Charles使用(二)

    Charles使用(二)   破解Charles 找到Charles应用-->右键显示包内容--->contents-->java:更换Charles.jar即可 链接: https ...