题目大意:

给定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的更多相关文章

  1. hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...

  2. 二分图匹配之最佳匹配——KM算法

    今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...

  3. ACM学习历程—POJ3565 Ants(最佳匹配KM算法)

    Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...

  4. 牛客暑期第六场G /// 树形DP 最大流最小割定理

    题目大意: 输入t,t个测试用例 每个测试用例输入n 接下来n行 输入u,v,w,树的无向边u点到v点权重为w 求任意两点间的最大流的总和 1.最大流最小割定理 即最大流等于最小割 2.无向树上的任意 ...

  5. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

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

  6. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  7. 二分图最大权匹配——KM算法

    前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...

  8. HDU2255 奔小康赚大钱【二分图最佳匹配】

    题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...

  9. hdu3488 Tour 拆点+二分图最佳匹配

    In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...

随机推荐

  1. 帝国cms把文章加入到收藏夹代码

    内容模板加这个:<a href="[!--news.url--]e/member/fava/add/?classid=[!--classid--]&id=[!--id--]&q ...

  2. NX-二次开发创建圆弧(三点圆弧)UF_CURVE_create_arc_3point

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> UF_initialize(); //起点 ]; ArcStartPoint[ ...

  3. NX二次开发-UFUN由工程图视图tag获取图纸页tag UF_DRAW_ask_drawing_of_view

    #include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...

  4. NX二次开发-UFUN获取图层的状态UF_LAYER_ask_status

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...

  5. 让nginx支持patchinfo,(支持codeigniter,thinkphp,ZF等框架)

    nginx 的config配置: server { listen ; server_name xxx; ....if (!-e $request_filename) { rewrite ^/(.*)$ ...

  6. 如何将Canvas中内容保存为图片

    Bitmap bm = Bitmap.createBitmap(320, 480, Config.ARGB_8888); Canvas canvas = new Canvas(bm); Paint p ...

  7. P1624 单词缩写

    P1624 单词缩写 题目描述 树树发现好多计算机中的单词都是缩写,如GDB是全称Gnu DeBug的缩写.但是,有时候缩写对应的全称会不固定,如缩写LINUX可以理解为: (1) LINus’s U ...

  8. AtCoder ABC 128F Frog Jump

    题目链接:https://atcoder.jp/contests/abc128/tasks/abc128_f 题目大意 给定长度为 N 的序列$s_0, s_1, \dots, s_{N-1}$,现在 ...

  9. Comet OJ - 2019 六一欢乐赛

    传送门 #A: 思路:等差数列求和,看成俩次1+2+…+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: #include<iostream> #include& ...

  10. 运行mybatis项目,运行测试类,点击test后,出现Cannot start compilation: the output path is not specified for module "前......

    Cannot start compilation: the output path is not specified for module "前 后来发现是在pom.xml右击,有个+号,把 ...