二分图最佳匹配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 ...
随机推荐
- break , continue 和 标签 跳出循环
break跳出代码块或循环 var i = 0: while ( i <= 10){ console.log(' i '); i ++; if ( i === 5 ) break; }// 0 ...
- The chance for love doesn't come around every day.
The chance for love doesn't come around every day.爱的机会不是每天都有的.
- ETL详解
ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...
- NX二次开发-C++的vector用法
#include <algorithm> //vector排序去重 sort( BoxNum.begin(), BoxNum.end()); BoxNum.erase(unique(Box ...
- C#利用栈实现字符串运算解析
附上参考文章链接:https://blog.csdn.net/qq_34831781/article/details/80104219 本人整合修复一些bug后的代码 using System; us ...
- 堡垒机介绍及实现 (使用python django实现)(一)
堡垒机介绍及实现 (使用python django实现)(一) 堡垒机的功能 我们在使用服务器的时候,通常的方式是 ssh user@ip 然后输入password 多人同时使用,就需要多个账号.这时 ...
- nginx按日分割日志
#!/bin/bash #按日切割nginx日志并压缩,加入crontab每天0:00切割 #作者:fafu_li #时间: source /etc/profile #加载系统环境变量 source ...
- [转]mysql主从同步
Mysql镜像机制配置过程主服务器: 192.168.0.25从服务器: 192.168.0.26MYSQL版本:mysql-5.0.22.tar.gz安装日期:2010年5月14日 一.镜 ...
- 剑指offer——11矩阵覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题解: 使用递归或者动态规划,明显,递归没有动态规划优 ...
- scrapy的使用-Request
Request对象在我们写爬虫,爬取一页的数据需要重新发送一个请求的时候调用.这个类需要传递一些参数.其中比较常用的参数有: 1.url 请求的url对象 2.callback 在下载器下载完 ...