二分图最佳匹配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 ...
随机推荐
- 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包
使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...
- JZOJ5153:树形图求和
Description Input Output HINT 题解: 一种很直观的想法是通过矩阵生成树求树形图方法数ans以及不包含某一条边i的树形图方法数ans[i],则答案为Σ(ans-ans[i] ...
- delphi编程实现为Windows窗口标题栏添加新按钮
下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮. 一.实现起来要定义以下过程: 1. 定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮. 在过程中要使用w ...
- class3_Entry & Text 输入和文本框
程序总体运行效果图如下; #!/usr/bin/env python # -*- coding:utf-8 -*- # -------------------------------------- ...
- 剑指offer——26反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 题解: 每次只反转一个节点,先记住cur->next, 然后pre->cur,即可; class Solution { pu ...
- scala 常用模式匹配类型
模式匹配的类型 包括: 常量模式 变量模式 构造器模式 序列模式 元组模式 变量绑定模式等. 常量模式匹配 常量模式匹配,就是在模式匹配中匹配常量 objectConstantPattern{ def ...
- Spark DataFrame中的join使用说明
spark sql 中join的类型 Spark DataFrame中join与SQL很像,都有inner join, left join, right join, full join; 类型 说明 ...
- 协方差及matlib绘制
转自http://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个 ...
- 使用python和tushare查询股票历史名称变更记录
接口:namechange 描述:历史名称变更记录 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 名称 | 类型 | 必选 ...
- Codeforces 479【A】div3试个水
题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...