[HDOJ3718]Similarity(KM算法,二分图最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3718
题意:有一堆答题情况和正确答案,问每一个答题情况的正确率最大是多少。
给每一对答案和答题情况的字母做映射,每次映射权值+1,这样会构造出一个二分图。在这个二分图上做最大匹配结果除以题目数量就是正确率。
#include <bits/stdc++.h>
using namespace std; const int maxm = ;
const int maxn = ;
const int inf = 0x3f3f3f3f;
int n, m, k;
int nx,ny;
int G[maxn][maxn];
int linker[maxn],lx[maxn],ly[maxn];
int slack[maxn];
bool visx[maxn],visy[maxn];
char ans[maxm];
char stu[maxm]; bool dfs(int x) {
visx[x] = true;
for(int y = ; y < ny; y++) {
if(visy[y])continue;
int tmp = lx[x] + ly[y] - G[x][y];
if(tmp == ) {
visy[y] = true;
if(linker[y] == - || dfs(linker[y])) {
linker[y] = x;
return true;
}
}
else if(slack[y] > tmp)
slack[y] = tmp;
}
return false;
}
int km() {
memset(linker,-,sizeof(linker));
memset(ly,,sizeof(ly));
for(int i = ;i < nx;i++) {
lx[i] = -inf;
for(int j = ;j < ny;j++)
if(G[i][j] > lx[i])
lx[i] = G[i][j];
}
for(int x = ;x < nx;x++) {
for(int i = ;i < ny;i++)
slack[i] = inf;
while(true) {
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
if(dfs(x))break;
int d = inf;
for(int i = ;i < ny;i++)
if(!visy[i] && d > slack[i])
d = slack[i];
for(int i = ;i < nx;i++)
if(visx[i])
lx[i] -= d;
for(int i = ;i < ny;i++) {
if(visy[i])ly[i] += d;
else slack[i] -= d;
}
}
}
int res = ;
for(int i = ;i < ny;i++)
if(linker[i] != -)
res += G[linker[i]][i];
return res;
} int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
nx = ny = ;
while(T--) {
scanf("%d%d%d",&n,&k,&m);
for(int i = ; i < n; i++) {
cin >> ans[i];
}
for(int _ = ; _ < m; _++) {
for(int i = ; i < n; i++) {
cin >> stu[i];
}
memset(G, , sizeof(G));
for(int i = ; i < n; i++) {
G[stu[i]-'A'][ans[i]-'A']++;
}
printf("%.4lf\n", (double)km()/(double)n);
}
} return ;
}
[HDOJ3718]Similarity(KM算法,二分图最大匹配)的更多相关文章
- # 匈牙利算法(二分图最大匹配)- hdu 过山车
匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...
- km算法(二分图最大权匹配)学习
啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...
- HDU 2255 KM算法 二分图最大权值匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 二分图学习记 之 KM算法 二分图最大权完美匹配。
前置知识 :匈牙利算法 首先有这样一张图,求这张图的最大权完美匹配. 当然如果你不想看这些渣图的话,您可以转到 洛谷 运动员最佳匹配问题 下面我来强行解释一下KM算法 左边一群妹子找汉子,但是每个妹子 ...
- poj1274 匈牙利算法 二分图最大匹配
poj1274 题意: 有n个奶牛, m个畜舍, 每个畜舍最多装1头牛,每只奶牛只有在自己喜欢的畜舍里才能产奶. 求最大产奶量. 分析: 其实题意很明显, 二分图的最大匹配, 匈牙利算法. #incl ...
- 二分图最大权完美匹配KM算法
KM算法二分图 KM求得二分图与普通二分图的不同之处在于:此二分图的每条边(男生女生)上都附了权值(好感度).然后,求怎样完美匹配使得权值之和最大. 这,不止一般的麻烦啊. 可以通过一个期望值来求. ...
- 【原创】我的KM算法详解
0.二分图 二分图的概念 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V, E)是一个无向图.如果顶点集V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在X中,另一个在Y ...
- 图论补档——KM算法+稳定婚姻问题
突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...
- 浅谈二分图的最大匹配和二分图的KM算法
二分图还可以,但是我不太精通.我感觉这是一个很烦的问题但是学网络流不得不学它.硬啃吧. 人比较蠢,所以思考几天才有如下理解.希望能说服我或者说服你. 二分图的判定不再赘述一个图是可被划分成一个二分图当 ...
- 带权二分图最大匹配KM算法
二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...
随机推荐
- NOIP200205均分纸牌
均分纸牌 描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张 ...
- Three.js - 网页3D应用的普及已经指日可待了
Three.js可以高效实现3D效果,真不赖.
- android 应用架构随笔四(View、ViewGroup)
View表示了用户界面的基本构建模块. 一个View占用了屏幕上的一个矩形区域并且负责界面绘制和事件处理.手机屏幕上所有看得见摸得着的都是View. Activity是四大组件中唯一一个用来和用户进行 ...
- Servlet概念框架
以 Servlet 3.0 源代码为基础.Servlet 是 Javaweb 应用的基础框架,犹如孙子兵法之于作战指挥官,不可不知. 概念框架 机制: 事件 Event, 监听器 Listener 数 ...
- 对比其它软件方法评估敏捷和Scrum
一般来说,选择一种软件开发方法,更像是加入一个邪教组织,而不像是做出了一个技术决策.许多公司甚至从未试图去评估这些方法,而仅仅是盲目采用最流行的方法,这就造成了如今五花八门的各种敏捷方法.因此本文将使 ...
- 学习Perl6: slice fastq file
需求: 只获取 ath 物种的 hairpin 序列 文件格式如下所示,以>打头的为 header,紧跟的为序列[AUCG]+ (Perl5 regexp 格式) #!/usr/bin/env ...
- List对象排序的通用方法
转自 @author chenchuang import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Me ...
- NEON简介【转】
转自:http://blog.csdn.net/fengbingchun/article/details/38020265 版权声明:本文为博主原创文章,未经博主允许不得转载. “ARM Advanc ...
- grads 读取浓度值
- JavaEE基础(九)
1.面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 ...