二分图最佳匹配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 ...
随机推荐
- SpringMVC 拦截器原理
前言 SpringMVC 拦截器也是Aop(面向切面)思想构建,但不是 Spring Aop 动态代理实现的, 主要采用责任链和适配器的设计模式来实现,直接嵌入到 SpringMVC 入口代码里面. ...
- StringUtils工具类常用api <转>
该工具类是用于操作Java.lang.String类的. StringUtils类与String类的区别在于:此类是null安全的,即如果输入参数String为null,则不会抛出NullPointe ...
- java script 基本函数
Math.random() 是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. 日期时间函数(需要用变量调用):var b = new Date(); // ...
- NOIp2018集训test-9-2(pm)
其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int 但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的.主要是林巨已经虐我125了要是再虐我200分我大概 ...
- [转]设置修改CentOS系统时区
在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...
- HDU-6441-Find Integer-费马大定理+奇偶数列法则
感觉这样看的比较清楚. 题意: 给出n和a,判断能否求出a^n+b^n=c^n中b和c的值,若可以输出b和c,否则则输出-1 -1. 思路: 数据给的比较大,但是题目很简单,套两个公式:费马打定理和奇 ...
- 2019 牛客多校第三场 H Magic Line
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题目大意 给定 N 个不同的整数点,N 为偶数,求一条直线,这条直线能把这 N 个点对半分开,输出这条直线 ...
- Codeforces 1166B - All the Vowels Please
题目链接:http://codeforces.com/problemset/problem/1166/B 个元音. 思路:先判断能否弄出至少5*5的行列,然后按顺序填字符串就好了. AC代码: #in ...
- Codeforces 1167A-Telephone Number
题目链接:http://codeforces.com/problemset/problem/1167/A 思路:检索前面0 ~(n −11)个字符中是否有 8 即可. AC代码: #include&l ...
- php连接docker启动的mysql容器报错:(HY000/2002): Connection refused的解决办法
vim libraries/config.default.php 查找到localhost/127.0.0.1字符[一般来说默认都是localhost] :/localhost 替换成容器名,例如我定 ...