当前位置: 首页 > 编程日记 > 正文

hdu2236 无题II 最大匹配 + 二分搜索

中文题目,题意大家都明白。

看到“不同的行和列”就觉得要用二分匹配来做。要求最大值与最小值的差值最小,是通过枚举边的下限和上限来完成。

枚举过程是这样的,在输入的过程可以记录下边权的最大值MAX和最小值MIN。那么他们的边权的差值的最大值为right = MAX -MIN ,最小值left =0。然后不断地增加边的下限,查找边权的差值,如果能得到完美匹配(匹配数等于n),那么就记录下这个差值。最后输出。这个搜索过程类似于最大流+二分搜索。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 const int N=105,INF=0x3f3f3f3f;
  8 int Map[N][N],cx[N],cy[N],dx[N],dy[N];
  9 bool bmask[N],bmap[N][N];
 10 int nx,ny,dis,ans;
 11 bool searchpath()
 12 {
 13     queue<int> q;
 14     dis=INF;
 15     memset(dx,-1,sizeof(dx));
 16     memset(dy,-1,sizeof(dy));
 17     for(int i=1;i<=nx;i++)
 18     {
 19         if(cx[i]==-1){ q.push(i); dx[i]=0; }
 20         while(!q.empty())
 21         {
 22             int u=q.front(); q.pop();
 23             if(dx[u]>dis) break;
 24             for(int v=1;v<=ny;v++)
 25             {
 26                 if(bmap[u][v]&&dy[v]==-1)
 27                 {
 28                     dy[v]= dx[u] + 1;
 29                     if(cy[v]==-1) dis=dy[v];
 30                     else
 31                     {
 32                         dx[cy[v]]= dy[v]+1;
 33                         q.push(cy[v]);
 34                     }
 35                 }
 36             }
 37         }
 38     }
 39     return dis!=INF;
 40 }
 41 int findpath(int u)
 42 {
 43     for(int v=1;v<=ny;v++)
 44     {
 45         if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1)
 46         {
 47             bmask[v]=1;
 48             if(cy[v]!=-1&&dy[v]==dis) continue;
 49             if(cy[v]==-1||findpath(cy[v]))
 50             {
 51                 cy[v]=u; cx[u]=v;
 52                 return 1;
 53             }
 54         }
 55     }
 56     return 0;
 57 }
 58 void maxmatch()
 59 {
 60     ans=0;
 61     memset(cx,-1,sizeof(cx));
 62     memset(cy,-1,sizeof(cy));
 63     while(searchpath())
 64     {
 65         memset(bmask,0,sizeof(bmask));
 66         for(int i=1;i<=nx;i++)
 67             if(cx[i]==-1) ans+=findpath(i);
 68     }
 69 }
 70 void init()
 71 {
 72     memset(bmap,0,sizeof(bmap));
 73 }
 74 
 75 int main()
 76 {
 77     //freopen("test.txt","r",stdin);
 78     int i,j,k,n,cas,a,b;
 79     scanf("%d",&cas);
 80     while(cas--)
 81     {
 82         scanf("%d",&n);
 83         a=100,b=0;
 84         for(i=1;i<=n;i++)
 85             for(j=1;j<=n;j++){
 86                 scanf("%d",&Map[i][j]);
 87                 a=min(a,Map[i][j]);
 88                 b=max(b,Map[i][j]);
 89             }
 90         nx=ny=n;
 91         int L=0,R=b-a,mid,flag,res;
 92         while(L<=R)
 93         {
 94             mid=(L+R)/2;
 95             flag=0;
 96             for(k=a;k<=b;k++)
 97             {
 98                 for(i=1;i<=n;i++)
 99                     for(j=1;j<=n;j++)
100                         if(Map[i][j]>=k&&Map[i][j]<=k+mid) bmap[i][j]=1;
101                         else bmap[i][j]=0;
102                 maxmatch();
103                 if(ans==n) {flag=1;break;}
104             }
105             if(flag) {res=mid;R=mid-1;}
106             else  L=mid+1;
107         }
108         printf("%d\n",res);
109     }
110     return 0;
111 }
View Code

转载于:https://www.cnblogs.com/Potato-lover/p/3989675.html

相关文章:

python十大标准_python对标准类型的分类

python的标准类型可以按照三种方式分类。一、按存储模型分类按存储模型分可以分为原子(标量)类型和容器类型。原子(标量)类型指对象(这里的对象不是对象数据类型&#xff0c;而是任何可能的值)的值只能含有一种数据类型&#xff0c;比如数值和字符串。容器类型指它们的值可以含…

mysql慢查询开启及分析方法

最近服务维护的公司的DB服务器&#xff0c;总是会出现问题&#xff0c;感觉需要优化一下了&#xff0c;登陆上去&#xff0c;发现慢查询日志都没有开&#xff0c;真是惭愧&#xff0c; 故果断加上慢查询日志&#xff0c;经过分析sql记录&#xff0c;发现问题很多&#xff0c;开…

如何在调试页面的时候清除页面的缓存?

1.按F12,弹出下图 2.点击右上角的三个点: 3.点击settings 4.找到Network,下面的Disable cache(while DevTools is open) 转载于:https://www.cnblogs.com/studybrother/p/10396990.html

JAVA图片处理--缩放,切割,类型转换

import java.io.*; import java.awt.*; import java.awt.image.*; import java.awt.Graphics; import java.awt.color.ColorSpace; import javax.imageio.ImageIO;public class ChangeImageSize {/** *//*** 缩放图像* param srcImageFile 源图像文件地址* param result …

文本框自动提示_Excel办公小技巧,使用艺术字与文本框,就是那么的简单

Excel中的艺术字同时拥有文字和图形两种对象的属性&#xff0c;不仅可以修改其中的内容&#xff0c;还可以调整形状的大小、设置边框以及内部填充等效果&#xff0c;常在编辑表格标题或者输入一些比较有提示性的文本时使用&#xff0c;在突出关键内容的同时美化表格效果添加艺术…

Linux之父盟友分道扬镳 直言开源模式软肋

Linux之父盟友分道扬镳 直言开源模式软肋2005-09-06 12:53:00标签&#xff1a;linux职场开源休闲从1993年起&#xff0c;Larry McVoy就一直是Linux之父Linus Torvalds最忠实的盟友之一。 然而经历了这些年后&#xff0c;McVoy开始相信&#xff0c;开源这种风靡一时、纷纷被…

身份证第18位计算

本文计算方式源自 百度百科&#xff0c;根据计算方式&#xff0c;Java计算代码如下文所示。 计算方法 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为&#xff1a;7&#xff0d;9&#xff0d;10&#xff0d;5&#xff0d;8&#xff0d;4&…

归并排序 算法

算法思路 将一个数列不断拆分为子序列&#xff0c;直到只剩下0或者1个元素再将子序列按顺序合并为原来数列的大小&#xff0c;完成排序 代码实现 //合并两个有序数组 vector<int> merge_two_sort(vector<int> &arr1, vector<int> &arr2) {vector&…

DRBD配置参数

用户手册&#xff1a;http://www.drbd.org/users-guide语法及详解参数&#xff1a;http://www.drbd.org/users-guide-emb/re-drbdconf.html官方示例&#xff1a;http://www.drbd.org/users-guidedrbd及其配置文件中的相关名词&#xff1a; failover&#xff1a;失效转移。通俗地…

两个苹果手机怎么传通讯录_苹果手机通讯录丢失怎么恢复?货真价实的通讯录恢复技巧...

苹果手机如果只是误删了某个好友的联系方式&#xff0c;完全可以通过其他共同好友要到联系方式&#xff0c;重新添加回手机。如果没有共同好友&#xff0c;或者将手机通讯录所有联系人丢失或误删&#xff0c;该怎么办呢&#xff1f;今天小编就教大家几种找回误删通讯录联系人的…

工作5年才有自己博客...汗...

工作5年才有自己博客...汗...转载于:https://www.cnblogs.com/zx19821107/p/3189640.html

Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax

链接&#xff1a;https://codeforces.com/problemset/problem/1113/C 题意&#xff1a;长度为n的序列 &#xff0c;若l&#xff0c;r满足&#xff0c;则称这对l&#xff0c;r为funny&#xff0c;其中mid&#xff08;r-l&#xff09;/2 求出共有几对funny 思路&#xff1a;上式等…

计数排序 算法

算法思路 统计待排序数列中每个数字出现的次数入数据结构的过程其实就是排序的过程最后再按照统计结果覆盖原序列就行了 PS: 前提条件是知道排序元素的范围 算法实现 void count(vector<int> &arr, int range) {vector<int> count(range1,0);for (int i 0…

Unity3D中的函数方法及解释

一、刷新函数 Update 当MonoBehaviour启用时&#xff0c;其Update在每一帧被调用。 LateUpdate 当Behaviour启用时&#xff0c;其LateUpdate在每一帧被调用。 FixedUpdate 当MonoBehaviour启用时&#xff0c;其 固定时间调用一次 二、启动函数 Awake 当一个脚本实例被载入时Awa…

asio boost 异步错误处理_boost::ASIO的同步方式和异步方式

http://blog.csdn.net/zhuky/article/details/5364574http://blog.csdn.net/zhuky/article/details/5364685Boost.Asio是一个跨平台的网络及底层IO的C编程库&#xff0c;它使用现代C手法实现了统一的异步调用模型。头文件#include 名空间using namespace boost::asio;ASIO库能够…

对Linux文件中的多行进行注释

1.讲文件中的所有行进行注释:1,$s/^/# 当然某些文件的注释不是“#”&#xff0c;你把“#”换成注释符就行了c2.对某些段进行注释&#xff1a;set nu 查看所有注释的段&#xff0c;比如发现要注释的第250到380&#xff1a;250…

利用反射对应数据库字段

#region DataSet数据读取protected delegate P GetDataSetItemHandler<P>(DataRow row);internal static T GetItem(DataRow dr){T item new T();DataTableAttribute tableAttribute DataEntity.GetTableAttribute<T>();if (tableAttribute ! null){for (int i …

多线程:pthread_cond_wait 实现原理

函数原型 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 第一个参数为需要等待的条件&#xff0c;第二个参数为互斥锁 一般该函数和 int pthread_cond_signal(pthread_cond_t *cond);函数一同使用&#xff0c;用来唤醒在cond条件上等待且处于就绪队列…

标头“Vary:Accept-Encoding”指定方法及其重要性分析

原文地址&#xff1a;http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html 在webkaka的网站速度诊断性能优化里有一项叫指定“Vary:Accept-Encoding”标头&#xff0c;可能很多人不太明白这是什么意思&#xff0c;不知道它对网站的影响有多大&a…

protobufjs 命令执行_【原码笔记】-- protobuf.js 与 Long.js

protobuf.js的结构和webpack的加载之后的结构很相似。这样的模块化组合是个不错的结构方式。1个是适应了不同的加载方式&#xff0c;2个模块直接很独立。webpack的功能更全一点。但如果自己封装js库这样够用了。而且模块对外统一接口 module.exports。这和node很像。(function(…

IBM X3550 RAID 扩容实例

背景&#xff1a;系统更新&#xff0c;原服务器容量不足&#xff0c;原服务器硬盘配置如下&#xff1a;2块146G 10K SAS 硬盘组成的RAID 1&#xff0c;咨询供应商&#xff0c;原来的硬盘已停产&#xff0c;现只有直接上两块新的盘增加一个RAID 1 实现扩容&#xff0c;增加两块3…

react取消监听scroll事件

如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法&#xff1a; // 这样写是移除不了滚动事件的 componentDidMount() {// 添加滚动监听window.addEventListener(scroll, ()>{console.log("滚动距离&#xff1a;",window…

ceph存储 PG的状态机 源码分析

文章目录PG 的状态机和peering过程1. PG 状态机变化的时机2. pg的状态演化过程3. pg状态变化实例讲解3.1 pg状态的管理结构3.2 数据的pg状态变化过程3.2.1 NULL -> initial3.2.2 initial -> reset -> Started3.2.3 Started(start) ->Started( primary(Peering(GetI…

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术。 一、JDBC基础知识 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;能够为多种关系数据库提供统一訪问&#xff0c;它由一组用Java语言…

Linux从mysql中读取数据_linux shell中读写操作mysql数据库

本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库&#xff0c;如何在shell中创建数据库&#xff0c;创建表&#xff0c;插入csv文件&#xff0c;读取mysql数据库&#xff0c;导出mysql数据库为xml或html文件&#xff0c; 并分析了核心语句。本…

算法系列之二十:计算中国农历(二)

&#xff08;接上篇&#xff09; 所谓的“天文算法”&#xff0c;就是利用经典力学定律推导行星运转轨道&#xff0c;对任意时刻的行星位置进行精确计算&#xff0c;从而获得某种天文现象发生时的时间&#xff0c;比如日月合朔这一天文现象就是太阳和月亮的地心黄经&#xff08…

如何限制只有某些IP才能使用Tomcat Manager

只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。Tomcat提供了两个参数供你配置&#xff1a;RemoteHostValve 和RemoteAddrValve&#xff0c;前者用于限制主机名&#xff0c;后者用于限制IP地址。 通过配置这两个参数&#xff0c;可以让你过滤来自请求的主机或IP地址&a…

leetcode-24 两两交换链表中的节点

题目描述 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 方法一&#xff08;递归&#x…

TimeQuest学习之三------外部寄存器模型

clock skew < destination reg clock delay > - < source reg clock delay > 为了使clock skew 的影响可以叠加到data delay上&#xff0c;给出如下三组公式&#xff08;对于fpga2ic&#xff09;&#xff1a; 1.clock skew <ext_clk delay> - < fpga_cl…

linux mysql远程链接_Linux下mysql实现远程连接

首先明白一点并不是mysql禁止远程连接&#xff0c;而是MYSQL的账号禁止远程连接。可能觉得我有点咬文嚼字了&#xff0c;不过我感觉分清这点还是很重要的。默认情况下&#xff0c;所有账号都是禁止远程连接的。在安装MYSQL的时候&#xff0c;在设置ROOT密码那里有一个CHECKBOX&…