大致题意:

给你两个长度相同的字符串,问这两个串中的字母怎么样匹配才能使得总的复合度最大。

大致思路:

按照字母间的对应关系建二分图,求出最大全匹配后除以总长度。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int nMax=55;
const int mMax=10005;
const int inf=1<<29;
int map[nMax][nMax];
int lx[nMax],ly[nMax];
int mapch[nMax];
int stack[nMax];
bool sy[nMax],sx[nMax];
int n,m,e,cnt;
int find (int u){int v,t;sx[u]=1;for(v=1;v<=m;v++){if(sy[v]) continue;t=lx[u]+ly[v]-map[u][v];if(t==0){sy[v]=1;if(mapch[v]==-1||find(mapch[v])){mapch[v]=u;return 1;}}else if(t<stack[v]) stack[v]=t;}return 0;
}
int KM(){int i,j,k,d,sum=0;cnt=0;for(i=1;i<=m;i++)ly[i]=0;memset(mapch,-1,sizeof(mapch));for(i=1;i<=n;i++){lx[i]=-inf;for(j=1;j<=m;j++)if(map[i][j]>lx[i])lx[i]=map[i][j];}for(i=1;i<=n;i++){for(j=1;j<=m;j++)stack[j]=inf;while(1){for(k=1;k<=m;k++) sy[k]=0;for(k=1;k<=n;k++) sx[k]=0;if(find(i)) break;d=inf;for(k=1;k<=m;k++)if(!sy[k]&&stack[k]<d)d=stack[k];for(k=1;k<=n;k++)if(sx[k]) lx[k]-=d;for(k=1;k<=m;k++)if(sy[k]) ly[k]+=d;else stack[k]-=d;}}for(i=1;i<=m;i++)if(mapch[i]!=-1&&map[mapch[i]][i]!=-inf){sum+=map[mapch[i]][i];}return sum;
}int num[mMax],sub[mMax];
int main(){int cas,i,j,N,M,K;char sss[3];n=m=26;scanf("%d",&cas);while(cas--){scanf("%d%d%d",&N,&M,&K);for(i=1;i<=N;i++){scanf("%s",sss);num[i]=sss[0]-'A'+1;}while(K--){for(i=1;i<=N;i++){scanf("%s",sss);sub[i]=sss[0]-'A'+1;}for(i=1;i<=n;i++){for(j=1;j<=m;j++){map[i][j]=0;}}for(i=1;i<=N;i++){map[sub[i]][num[i]]++;}double ans=KM();ans/=(N*1.0);printf("%.4f\n",ans);}}return 0;
}

[KM算法]hdoj 3718:Similarity相关推荐

  1. [最小费用流 || KM算法]hdoj 3395:Special Fish

    大致题义: 给出n条鱼之间相互攻击的关系以及每条鱼的能量值,每条鱼只能攻击或者被攻击最多一次(也就是被攻击之后无法攻击别人,或者攻击别人之后无法被攻击).一次攻击行为产能为这两条鱼能量值的异或值.求总 ...

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

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

  3. [KM算法]hdoj 3722:Card Game

    大致题意:     要把n个字符串首尾相连成若干个环,如果把s1接到s2的后面可以得到一定的收获值,这个值等于s2的逆序 和s1的最长相同前缀的长度.求总收获值最大是多少. 大致思路:     看完题 ...

  4. [KM算法]hdoj 2853:Assignment

    大致题意: n个部队到m个地区抗震救灾(缅怀四川地震死难同胞).已知每只部队到每个地区的收益值,现在给出一种匹配方案.求出达到最大匹配时的收益值比当前匹配方案多多少,且需要有多少只部队的调动不需要改动 ...

  5. [KM算法]hdoj 2426:Interesting Housing Problem

    大致题意: 有n个小孩要去m间屋子,每间屋子只能住一个人.每个小孩都会对一些屋子打分.已知每个小孩不能去那些他打负分和没打分的屋子,求安排住宿后所有人对自己屋子打分之和最大值是多少. 大致思路: KM ...

  6. KM算法 入门——[kuangbin]KM匹配

    之前写过了关于普通二分匹配的相关题目了,就是寻找尽量多的边使得任意边连接的两点都没有与其他边相连,而km算法解决的则是在带权的二分图中寻找权值和最大的匹配,可以通过先给无连接的点连上权值为0或者负无穷 ...

  7. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法

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

  8. HDU(2255),KM算法,最大权匹配

    题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. KM算法 详解+模板

    先说KM算法求二分图的最佳匹配思想,再详讲KM的实现. [KM算法求二分图的最佳匹配思想] 对于具有二部划分( V1, V2 )的加权完全二分图,其中 V1= { x1, x2, x3, ... , ...

最新文章

  1. 添加和移除disabled属性
  2. PyTorch学习笔记——pytorch图像处理(transforms)
  3. mysql连接数设置操作(Too many connections)及设置md5值的加密密码
  4. MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
  5. 怎么防爬虫爬取信息_scrapy爬取51job职位信息(针对新的反爬虫机制)!
  6. 虚拟的云服务器需要重启吗,虚拟主机重启服务器吗
  7. public medical image database
  8. leetcode 455. 分发饼干 思考分析
  9. HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)
  10. Why hash maps in Java 8 use binary tree instead of linked list?
  11. 网站平台架构演变史(四) - 水平拆分的查询
  12. smart-webcomponents 14.2.0 Crack
  13. Katalon Recorder简介与使用
  14. Java基础寒假作业-个人所得税计算系统
  15. HashMap遍历时移除元素
  16. 在线的h5编辑器汇总和分析
  17. <<算法很美>>——(七)——DFS典题(一):水洼数目
  18. 优课在线 实境英语作业3Unit 11-15
  19. 别再稀里糊涂的使用ls命令了,带你重新认识linux查看文件信息的ls【内涵长文,非命令参数罗列】
  20. DB2数据库基本概念

热门文章

  1. 搜索框中“请输入搜索关键字”
  2. 加拿大安省哪个高中注重计算机,加拿大安省高中课程如何选择?
  3. [2011 年终项目总结] 第二章、环境搭建
  4. 讲讲udp内网穿透又叫做udp打洞
  5. postgres clog事物可见性测试
  6. COS 音视频实践 | 数据工作流助你播放多清晰度视频
  7. 可牛免费杀毒1.5beta2 全新自我保护支持64位系统
  8. [原创歌词]网络爱人
  9. dwr3实现消息精准推送详细步骤
  10. 全球10大智慧城市大数据应用案例