题意:先给出N个字母,代表要标签;再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值。最后的相似度为最大权值为ans*1.0/n.

最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。

KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出。否则修改
顶标, 再用匈牙利算法处理, 如此重复。

设二分图的两部分点集分别为 X={X1,X2,…,Xn}X={X1,X2,…,Xn} 和 Y={Y1,Y2,…,Ym}Y={Y1,Y2,…,Ym}, ⟨Xi,Yj⟩⟨Xi,Yj⟩ 的边权为 wij
给两部分点集分别赋点权 {Ai},{Bi}{Ai},{Bi}, 使得 Ai+Bj⩾wij,取等的边的生成子图叫做相等子图。那么相等子图的完美匹配就是最大权匹配。我们需要适当选取权值,使相等子图有完美匹配。
算法步骤:
1.若成功(找到了增广轨),则该点增广完成,进入下一个点的增广
2.若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。
操作为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全 部减去一个常数d,所有在增广轨中的Y方点的标号全部加上一个常数d

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<iomanip>
using namespace std;
const int maxx=105;
const int maxn=10005;
const int inf=0x3f3f3f3f;
int lx[maxx],ly[maxx];
int visx[maxx],visy[maxx];
int w[maxx][maxx];
int linker[maxx];
int slack[maxx];
int n,m,k;
char ch[5];
char p[maxn];
char p1[maxn];
void init(){memset(linker,0,sizeof(linker));memset(w,0,sizeof(w));
}
int Find(int x){visx[x]=1;for(int y=1;y<=26;y++){if(visy[y]==0){int temp=lx[x]+ly[y]-w[x][y];if(temp==0){visy[y]=1;if(linker[y]==0||Find(linker[y])){linker[y]=x;return 1;}}else{slack[y]=min(slack[y],temp);}}}return 0;
}
int KM(){memset(ly,0,sizeof(ly));for(int i=1;i<=26;i++){lx[i]=-inf;}for(int i=1;i<=26;i++){for(int j=1;j<=26;j++){if(lx[i]<w[i][j]){lx[i]=w[i][j];}}}for(int k=1;k<=26;k++){for(int i=1;i<=26;i++){slack[i]=inf;}while(true){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));if(Find(k))break;int d=inf;for(int i=1;i<=26;i++){if(visy[i]==0){d=min(d,slack[i]);}}if(d==inf)return 0;for(int i=1;i<=26;i++){if(visx[i]==1)lx[i]-=d;if(visy[i]==1)ly[i]+=d;else{slack[i]-=d;}}}}int ans=0;for(int i=1;i<=26;i++){if(linker[i]!=0){ans+=w[linker[i]][i];}}return ans;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d %d",&n,&k,&m);init();for(int i=1;i<=n;i++){scanf("%s",&ch);p[i]=ch[0];}for(int i=1;i<=m;i++){init();for(int j=1;j<=n;j++){scanf("%s",ch);p1[j]=ch[0];w[p[j]-'A'+1][p1[j]-'A'+1]++;}int ans=KM();cout<<setiosflags(ios::fixed)<<setprecision(4)<<1.0*ans/n<<endl;}}return 0;
}

HDU3718(最大权完美匹配)相关推荐

  1. poj2195(最大权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:采用最大权完美匹配 最大权完美匹配:二分图最大匹 ...

  2. poj3565(最大权完美匹配)

    题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离! 思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间 ...

  3. HDU3488(最大权完美匹配)

    题意:有N个城市M单程公路将它们连接起来:要求路路应该包含一个或多个循环a->B->-->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市 ...

  4. HDU2853(最大权完美匹配)

    题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配) 其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边) 这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇.除了 ...

  5. 模板 - KM算法(O(n^3))(二分图最大权完美匹配)

    整理的算法模板合集: ACM模板 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配. 求一种完美匹配的方案,使得最终匹配边的边权之和最大. //Data const ...

  6. poj3686(最小权值完美匹配)

    开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...

  7. HDU1533(最小权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...

  8. HDU2255(最全权完美匹配)

    最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法.当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配.此时问题就转化为二分图最大权完美匹配. ...

  9. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

最新文章

  1. Ubuntu下非常规方法安装绿色软件(压缩包)
  2. 有图有真相!同是滑屏,荣耀Magic2不只比小米MIX3缝隙小,还更稳定
  3. Docker (2)与虚拟机的比较
  4. C#3.0语言规范new [Unified C# 3.0 Specification Now Available]
  5. SAP Spartacus维护CMS Component到Angular Component的源代码位置
  6. android 瀑布流
  7. 电脑鸿蒙操作系统,鸿蒙操作系统面世 华为称“把不可能变为可能”
  8. 怀俄明州议员Cynthia Lummis:加密监管需要为创新留有空间
  9. 【白皮书分享】2021-2022内容营销平台价值洞察白皮书.pdf(附下载链接)
  10. 【资料整理】squid安装和配置代理上网
  11. Windows核心编程_在Visual Studio窗口输出调试信息
  12. 3.Linux性能诊断 --- 快速检查单(10个命令) 监控
  13. 机器学习的最佳入门学习资源【转】
  14. 输入银行卡号匹配银行名称
  15. 卡通漫画Photobacks Cartoon 2.0 PS扩展面板汉化版 支持CC2019
  16. python循环语句while教案_while循环教学设计
  17. 用matlab绘制幅相特性曲线(Nyquist图)
  18. 电信网编号计划征求意见 物联网产业有望迎来风口
  19. 代码审计--25--RIPS详细
  20. PyTorch-05神经网络与全连接(Logistic Regression、交叉熵、交叉熵来优化一个多分类的问题、全连接层(MLP网络层)、激活函数与GPU加速、测试、Visdom可视化)

热门文章

  1. 美多商城之商品(商品数据库表设计)
  2. Linux之查看目录命令
  3. IP数据报-格式-分片
  4. 期末Linux复习容易迷糊的地方!
  5. 坑爹的BufferManager
  6. 22种代码坏味道及重构手段
  7. [Java]JDBC操作MySQL数据库
  8. linux学习之VNC远程控制(一)
  9. java 为什么需要常量池
  10. HttpComponents