hdu2236
2024-10-01 14:25:36
链接:点击打开链接
题意:在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里而且要求这n个数中的最大值和最小值的差值最小
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int s[105][105],match[105],vis[105];
int n,p,low,high,mid,minn,maxx;
int dfs(int x){
int i;
for(i=1;i<=n;i++){
if(s[x][i]>=p&&s[x][i]<=p+mid&&!vis[i]){
vis[i]=1;
if(!match[i]||dfs(match[i])){
match[i]=x;
return 1;
}
}
}
return 0;
}
int hungarian(){
int i;
memset(match,0,sizeof(match));
for(i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(!dfs(i))
return 0;
}
return 1;
} //匈牙利算法模板
int main(){ //要求不同行不同列因此用到二分图最大匹配看是否全部的
int t,i,j,sign; //数据在指定区间中
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(s,0,sizeof(s));
maxx=-1;minn=99999999;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&s[i][j]);
maxx=max(maxx,s[i][j]);
minn=min(minn,s[i][j]);
}
high=maxx-minn;low=0; //二分差值的大小
while(low<high){
sign=0;
mid=(low+high)/2;
for(p=minn;p+mid<=maxx;p++){//看是否完美匹配时全部数据满足在[p,p+mid]范围内
if(hungarian()){
sign=1;
break;
}
}
if(sign)
high=mid; //满足时则改变high值看能否继续满足更小的区间
if(!sign)
low=mid+1;
}
printf("%d\n",high);
}
return 0;
}
最新文章
- mac常用的命令
- Response.End抛出ThreadAbortException 异常
- MyBatis之四:调用存储过程含分页、输入输出参数
- NOIP2003 侦探推理
- 将UIImage保存到iOS照片库和对应程序沙盒中-b
- CodeForces 566D 并查集集合合并
- 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
- 爬取知名社区技术文章_article_3
- jsfl 删除库指定内容
- Spring基于AspectJ的AOP的开发——注解
- js隐藏中间4位,变成‘*’号
- Android,重新出发!
- Python 可调用对象
- Go语言实战 (William,Kennedy 等著)
- 将Boost库添加到Visual Studio 2017
- 1028. Hanoi Tower Sequence
- [转]How to Use xp_dirtree to List All Files in a Folder
- js-权威指南学习笔记18
- linux可视化桌面安装
- RabbitMQ消息队列生产者和消费者
热门文章
- 【codeforces 501D】Misha and Permutations Summation
- Linux 上安装 Zookeepr
- 洛谷 P2393 yyy loves Maths II
- 站点搭建从零開始(二)server空间
- Codeforces Round #261 (Div. 2)459A. Pashmak and Garden(数学题)
- 使用LSTM做电影评论负面检测——使用朴素贝叶斯才51%,但是使用LSTM可以达到99%准确度
- TSNE——目前最好的降维方法
- ES正常停止步骤
- 91.Bower : ENOGIT git is not installed or not in the PATH 解决方法
- Java 以空格分割字符串