无题II

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 571    Accepted Submission(s): 296

Problem Description
这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。
Input
输入一个整数T表示T组数据。
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。
Output
对于每组数据输出一个数表示最小差值。
Sample Input
1 4 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
Sample Output
3
Author
xhd
Source
HDOJ 2008 Summer Exercise(2)- Hold by Captain Xu
Recommend
lcy
code :
  1 /*
  2 为了保证每行每列只取一个元素,我们可以从二分图最大匹配的思想入手,把行和列分别看做二分图左右两部分,
  3 i-j的边权就是第i行第j列的元素的值。这样构图之后,求得的二分图最大匹配的4条边就是不在同行或同列的4个元素。
  4 有了这个思想时候,我们只需要再保证4个元素中最大值与最小值之差尽量小就可以了,于是我们可以二分枚举最大值与最小值之差,
  5 并枚举边权值的下界,如果枚举到某个边权值的下界时该图存在最大匹配,那么就更新max,否则就更新min。
  6 */
  7 #include <iostream>
  8 #include <iomanip>
  9 #include <fstream>
 10 #include <sstream>
 11 #include <algorithm>
 12 #include <string>
 13 #include <set>
 14 #include <utility>
 15 #include <queue>
 16 #include <stack>
 17 #include <list>
 18 #include <vector>
 19 #include <cstdio>
 20 #include <cstdlib>
 21 #include <cstring>
 22 #include <cmath>
 23 #include <ctime>
 24 #include <ctype.h>
 25 using namespace std;
 26
 27 #define MAXN 110
 28
 29 int map[MAXN][MAXN];
 30 int vst[MAXN];
 31 int path[MAXN];
 32 int n;
 33 int p;
 34 int minnum,maxnum,midnum;
 35
 36 bool dfs(int v)
 37 {
 38     for(int i=0;i<n;i++)
 39         if(map[v][i]>=p&&map[v][i]<=p+midnum&&!vst[i])
 40         {
 41             vst[i]=1;
 42             if(path[i]==-1||dfs(path[i]))
 43             {
 44                 path[i]=v;
 45                 return true;
 46             }
 47         }
 48     return false;
 49 }
 50
 51 bool hungary()
 52 {
 53     memset(path,-1,sizeof(path));
 54     for(int i=0;i<n;i++)
 55     {
 56         memset(vst,0,sizeof(vst));
 57         if(!dfs(i))                                //一旦发现有横坐标没有对应的y坐标与其匹配就return false
 58             return false;
 59     }
 60     return true;                       //表示所有的横坐标已经全部匹配,return true
 61 }
 62
 63 int main()
 64 {
 65     int t;
 66     int i,j;
 67     scanf("%d",&t);
 68     while(t--)
 69     {
 70         int gmax=0,gmin=101;
 71         scanf("%d",&n);
 72         for(i=0;i<n;i++)
 73             for(j=0;j<n;j++)
 74             {
 75                 scanf("%d",&map[i][j]);
 76                 gmax=gmax>map[i][j]?gmax:map[i][j];
 77                 gmin=gmin<map[i][j]?gmin:map[i][j];
 78             }
 79         maxnum=gmax-gmin;
 80         minnum=0;
 81         while(1)
 82         {
 83             bool flag=false;
 84             midnum=(maxnum+minnum)/2;
 85             for(p=gmin;p+midnum<=gmax;p++)
 86             {
 87                 if(hungary())
 88                 {
 89                     flag=true;
 90                     break;
 91                 }
 92             }
 93             if(flag)
 94                 maxnum=midnum;
 95             if(midnum==minnum)                  //注意:这三个if的顺序不能随意颠倒
 96                 break;
 97             if(!flag)
 98                 minnum=midnum;
 99         }
100         printf("%d\n",maxnum);
101     }
102     return 0;
103 }

转载于:https://www.cnblogs.com/XBWer/archive/2012/08/14/2638207.html

HDOJ---2236 无题II[二分枚举+匈牙利]相关推荐

  1. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  2. 二分枚举+贪心(nyist疯牛)

    点我啊~带你去找它\(^o^)/~ 一开始一点思路都没有,压根不知道它要求的是什么,然后问了一下班长,才明白题目的意思就是,给你N个点,要你找出最优解的C点,言简意赅的即使说区间选点. 思路: 假设两 ...

  3. poj 2455 Secret Milking Machine(二分枚举+最大流)

    题意: 题意:FJ有N块地,这些地之间有P条双向路,每条路的都有固定的长度l.现在要你找出从第1块地到第n块地的T条不同路径,每条路径上的路不能与先前的路径重复,问这些路径中的最长路的最小是多少. 思 ...

  4. Brownie Slicing(二分枚举答案)

    描述 Bessie has baked a rectangular brownie that can be thought of as an RxC grid (1 <= R <= 500 ...

  5. POJ 2455 Secret Milking Machine 二分枚举 + 最大流

    题目:http://poj.org/problem?id=2455 题意:给定一张无向图,有n个节点p条边,要求在图中从1到n找到t条路径,并且使这t条路径中的最长边最小,输出这个最小的最长边 思路: ...

  6. ⭐算法入门⭐《二分枚举》简单15 —— LeetCode LCP 18. 早餐组合

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   小扣在秋日市集选择了一 ...

  7. 【二分枚举】04:网线主管

    还是二分搜索枚举解空间的题目. 代码思路基本上就是,找到解空间的上下限[base,top],然后main函数里面进行二分枚举,另外需要写一个判断某个值是否合法的函数. 04:网线主管 总时间限制:  ...

  8. [Codeforces Round #635 (div2)]1337D - Xenia and Colorful Gems[二分][枚举]

    1337D - Xenia and Colorful Gems[二分][枚举] time limit per test memory limit per test input output 3 sec ...

  9. ⭐算法入门⭐《二分枚举》中等03 —— LeetCode 1539. 第 k 个缺失的正整数

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你一个 严格升序排列 ...

最新文章

  1. php7+的php-fpm参数配置,注意事项
  2. 捅破窗户纸:如何从过程到对象—For金色的海洋以及所有为面向对象而困惑的Tx...
  3. SQL2005客户端连接到SQL2000服务器存在的问题
  4. 如何利用XShell隧道通过跳板机连接内网机器
  5. 网易云信实时音频框架背后:算法优化带来产品体验全面提升
  6. numpy基础(part8)--符号数组与矢量化
  7. linux sha1sum命令,讲解Linux中校验文件的MD5码与SHA1码的命令使用
  8. 为什么总是有人说Java啰嗦,却没人说C++啰嗦?
  9. python表达式的值是 y 和n是什么意思_python中^是什么意思
  10. 赞!清华大学发布首个自动图机器学习工具包AutoGL
  11. 抖音发布2020数据报告:日均视频搜索量破4亿,70后最爱发表情包
  12. 调用赋码远程服务异常_Remoting远程访问的这个异常怎么处理???
  13. Modscan32使用注意事项
  14. 实战案例丨腾讯安全托管服务MSS助力数字广东重保期间“0事故”
  15. 【 开源计划 - Flutter组件 】 星星也可以如此闪耀 flutter_star
  16. VBA-自动筛选符合条件的数据
  17. HTML学生个人网站作业设计:旅游景点网站设计——北京故宫(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  18. 2022年蓝桥杯省赛 C/C++ A组题解
  19. 【问题解决】安装Oracle数据库,中途提示未找不到文件的解决办法(附带图文)
  20. Windows编程 第四回 Windows程序的生与死(下)

热门文章

  1. java三元操作符注意
  2. 160 - 17 bjanes.3
  3. office数据集dslr_DSLR的完整形式是什么?
  4. 在Python中将字符串拆分为字符数组
  5. C#| 使用String.Format()方法将小数点前的数字四舍五入
  6. 02-对图像进行边界填充
  7. FreeRTOS时间管理
  8. CodeForces 558A,B
  9. C++ 深浅拷贝 01
  10. 评估报告有效期过期了怎么办_托福成绩过期了怎么办?