题目大意:

给定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

题解

  1. #include <bits/stdc++.h>
  2. #define MAXN 205
  3. #define INF 0x3f3f3f3f
  4. using namespace std;
  5. int n,mint;
  6. int G1[MAXN][],G2[MAXN][];
  7. int G[MAXN][MAXN],link[MAXN];
  8. int x[MAXN],y[MAXN];
  9. int visx[MAXN],visy[MAXN];
  10. bool DFS(int s) {
  11. visx[s]=;
  12. for(int i=;i<=n;i++) {
  13. if(visy[i]) continue;
  14. int tmp=x[s]+y[i]-G[s][i];
  15. if(tmp==) {
  16. visy[i]=;
  17. if(link[i]==- || DFS(link[i])) {
  18. link[i]=s; return true;
  19. }
  20. }
  21. else if(tmp > ) {
  22. mint=min(mint,tmp);
  23. }
  24. }
  25. return false;
  26. }
  27. void KM()
  28. {
  29. for(int i=;i<=n;i++) {
  30. link[i]=-; y[i]=x[i]=;
  31. for(int j=;j<=n;j++)
  32. x[i]=max(x[i],G[i][j]);
  33. }
  34. for(int i=;i<=n;i++) {
  35. while() {
  36. mint =INF;
  37. memset(visx,,sizeof(visx));
  38. memset(visy,,sizeof(visy));
  39. if(DFS(i)) break;
  40. for(int i=;i<=n;i++) {
  41. if(visx[i]) x[i]-=mint;
  42. if(visy[i]) y[i]+=mint;
  43. }
  44. }
  45. }
  46. int out=;
  47. for(int i=;i<=n;i++) out+=G[link[i]][i];
  48. printf("%d\n",*n-out);
  49. }
  50. int main()
  51. {
  52. while(~scanf("%d",&n)) {
  53. for(int i=;i<=n;i++)
  54. for(int j=;j<=;j++) scanf("%d",&G1[i][j]);
  55. for(int i=;i<=n;i++)
  56. for(int j=;j<=;j++) scanf("%d",&G2[i][j]);
  57. for(int i=;i<=n;i++)
  58. for(int j=;j<=n;j++) {
  59. int cnt=;
  60. for(int p=;p<=;p++)
  61. for(int q=;q<=;q++)
  62. if(G1[i][p]==G2[j][q]) cnt++;
  63. G[i][j]=cnt;
  64. }
  65. KM();
  66. }
  67.  
  68. return ;
  69. }

KM算法讲解

https://blog.csdn.net/sixdaycoder/article/details/47720471

https://blog.csdn.net/c20180630/article/details/71080521

  1. int n,mint;
  2. int G[MAXN][MAXN],link[MAXN];
  3. int x[MAXN],y[MAXN];
  4. int visx[MAXN],visy[MAXN];
  5. bool DFS(int s) {
  6. visx[s]=;
  7. for(int i=;i<=n;i++) {
  8. if(visy[i]) continue;
  9. int tmp=x[s]+y[i]-G[s][i];
  10. if(tmp==) {
  11. visy[i]=;
  12. if(link[i]==- || DFS(link[i])) {
  13. link[i]=s; return true;
  14. }
  15. }
  16. else if(tmp > ) {
  17. mint=min(mint,tmp);
  18. }
  19. }
  20. return false;
  21. }
  22. void KM()
  23. {
  24. for(int i=;i<=n;i++) link[i]=-;
  25. for(int i=;i<=n;i++) {
  26. while() {
  27. memset(visx,,sizeof(visx));
  28. memset(visy,,sizeof(visy));
  29. if(DFS(i)) break;
  30. for(int i=;i<=n;i++) {
  31. if(visx[i]) x[i]-=mint;
  32. if(visy[i]) y[i]+=mint;
  33. }
  34. }
  35. }
  36. }

模板

二分图最佳匹配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. 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包

    使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...

  2. JZOJ5153:树形图求和

    Description Input Output HINT 题解: 一种很直观的想法是通过矩阵生成树求树形图方法数ans以及不包含某一条边i的树形图方法数ans[i],则答案为Σ(ans-ans[i] ...

  3. delphi编程实现为Windows窗口标题栏添加新按钮

    下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮. 一.实现起来要定义以下过程: 1. 定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮. 在过程中要使用w ...

  4. class3_Entry & Text 输入和文本框

    程序总体运行效果图如下;   #!/usr/bin/env python # -*- coding:utf-8 -*- # -------------------------------------- ...

  5. 剑指offer——26反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头.   题解: 每次只反转一个节点,先记住cur->next, 然后pre->cur,即可;   class Solution { pu ...

  6. scala 常用模式匹配类型

    模式匹配的类型 包括: 常量模式 变量模式 构造器模式 序列模式 元组模式 变量绑定模式等. 常量模式匹配 常量模式匹配,就是在模式匹配中匹配常量 objectConstantPattern{ def ...

  7. Spark DataFrame中的join使用说明

    spark sql 中join的类型 Spark DataFrame中join与SQL很像,都有inner join, left join, right join, full join; 类型 说明 ...

  8. 协方差及matlib绘制

    转自http://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个 ...

  9. 使用python和tushare查询股票历史名称变更记录

    接口:namechange 描述:历史名称变更记录 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 名称       |       类型       |       必选    ...

  10. Codeforces 479【A】div3试个水

    题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...