二分图最佳匹配KM算法 /// 牛客暑期第五场E
题目大意:
给定n,有n间宿舍 每间4人
接下来n行 是第一年学校规定的宿舍安排
接下来n行 是第二年学生的宿舍安排意愿
求满足学生意愿的最少交换次数
input
2
1 2 3 4
5 6 7 8
4 6 7 8
1 2 3 5
output
2
#include <bits/stdc++.h>
#define MAXN 205
#define INF 0x3f3f3f3f
using namespace std;
int n,mint;
int G1[MAXN][],G2[MAXN][];
int G[MAXN][MAXN],link[MAXN];
int x[MAXN],y[MAXN];
int visx[MAXN],visy[MAXN];
bool DFS(int s) {
visx[s]=;
for(int i=;i<=n;i++) {
if(visy[i]) continue;
int tmp=x[s]+y[i]-G[s][i];
if(tmp==) {
visy[i]=;
if(link[i]==- || DFS(link[i])) {
link[i]=s; return true;
}
}
else if(tmp > ) {
mint=min(mint,tmp);
}
}
return false;
}
void KM()
{
for(int i=;i<=n;i++) {
link[i]=-; y[i]=x[i]=;
for(int j=;j<=n;j++)
x[i]=max(x[i],G[i][j]);
}
for(int i=;i<=n;i++) {
while() {
mint =INF;
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(DFS(i)) break;
for(int i=;i<=n;i++) {
if(visx[i]) x[i]-=mint;
if(visy[i]) y[i]+=mint;
}
}
}
int out=;
for(int i=;i<=n;i++) out+=G[link[i]][i];
printf("%d\n",*n-out);
}
int main()
{
while(~scanf("%d",&n)) {
for(int i=;i<=n;i++)
for(int j=;j<=;j++) scanf("%d",&G1[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=;j++) scanf("%d",&G2[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) {
int cnt=;
for(int p=;p<=;p++)
for(int q=;q<=;q++)
if(G1[i][p]==G2[j][q]) cnt++;
G[i][j]=cnt;
}
KM();
} return ;
}
KM算法讲解
https://blog.csdn.net/sixdaycoder/article/details/47720471
https://blog.csdn.net/c20180630/article/details/71080521
int n,mint;
int G[MAXN][MAXN],link[MAXN];
int x[MAXN],y[MAXN];
int visx[MAXN],visy[MAXN];
bool DFS(int s) {
visx[s]=;
for(int i=;i<=n;i++) {
if(visy[i]) continue;
int tmp=x[s]+y[i]-G[s][i];
if(tmp==) {
visy[i]=;
if(link[i]==- || DFS(link[i])) {
link[i]=s; return true;
}
}
else if(tmp > ) {
mint=min(mint,tmp);
}
}
return false;
}
void KM()
{
for(int i=;i<=n;i++) link[i]=-;
for(int i=;i<=n;i++) {
while() {
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(DFS(i)) break;
for(int i=;i<=n;i++) {
if(visx[i]) x[i]-=mint;
if(visy[i]) y[i]+=mint;
}
}
}
}
模板
二分图最佳匹配KM算法 /// 牛客暑期第五场E的更多相关文章
- hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...
- 二分图匹配之最佳匹配——KM算法
今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...
- ACM学习历程—POJ3565 Ants(最佳匹配KM算法)
Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...
- 牛客暑期第六场G /// 树形DP 最大流最小割定理
题目大意: 输入t,t个测试用例 每个测试用例输入n 接下来n行 输入u,v,w,树的无向边u点到v点权重为w 求任意两点间的最大流的总和 1.最大流最小割定理 即最大流等于最小割 2.无向树上的任意 ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- 二分图最大权匹配——KM算法
前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...
- HDU2255 奔小康赚大钱【二分图最佳匹配】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...
- hdu3488 Tour 拆点+二分图最佳匹配
In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...
随机推荐
- ftp和ssh登录缓慢的解决办法
在垃圾邮件和短信盛行的今天,邮件和短信,拦截与反向域名解析的方式,有效的防止了垃圾短信.邮件的入侵.Vsfpd和sshd同样利用了反向域名解析这一功能(默认开启),.在客户端向server端请求访问时 ...
- 基于Netty的RPC架构学习笔记(一):NIO
文章目录 传统的socket分析 举个
- 关于idea中,web项目启动tomcat,访问资源报错404
背景: web项目启动tomcat,访问相应的资源,报错404,前提资源路径是没错的. 原因: 1.确定是不是web项目 不是的话: 配置web-inf的路径和webroot(web根目录)的路径 2 ...
- java发送http的get/post请求(一)
HTTP请求类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; ...
- Day9, 进程、线程、协程篇
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- 来个我一起学习Python把!!!(新手共同努力)
<初识Python> 大家好,让我们一起来学习Python,因本人也是个新手但我会把我所学的东西分享出来,并记录自己的经验学习过程,不单单是分享代码,会详细的讲解,如有错误地方希望大家指点 ...
- 深夜Python - 第1夜 - for 迷 in 迷思
深夜Python - 第1夜 - for 迷 in 迷思 在一个月黑风高的夜晚,我悄悄打开编辑器,进入程序的世界.刚刚学会Python的我,由于一段时间的过度装B,被委托优化一段程序,我信心十足地接下 ...
- <pygame> 打飞机(小游戏)
0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...
- docker使用gitlab持续集成(1)
修改ssh连接端口vi /etc/ssh/sshd_config 写docker-compose.yml文件配置gitlab version: '3' services: gitlab: image: ...
- Springboot整合dubbo搭建基本的消费、提供和负载均衡
文章目录 1.确定接口 2.创建提供者 2.1 pom配置 2.2dubbo配置文件 2.3 application.properties 2.4 mybatis相关 2.4.1 配置UserMapp ...