hdoj 2236 无题II 【二分图匹配&&匈牙利算法】
2016-03-23 19:47
218 查看
Total Submission(s): 1414 Accepted Submission(s): 632
[align=left]Problem Description[/align]
这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。
[align=left]Input[/align]
输入一个整数T表示T组数据。
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。
[align=left]Output[/align]
对于每组数据输出一个数表示最小差值。
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
分析:
先用二分图匹配匈牙利算法找出这n个数,然后令这些数的差值最小。
代码:
无题II
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1414 Accepted Submission(s): 632
[align=left]Problem Description[/align]
这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。
[align=left]Input[/align]
输入一个整数T表示T组数据。
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。
[align=left]Output[/align]
对于每组数据输出一个数表示最小差值。
[align=left]Sample Input[/align]
1 4 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
[align=left]Sample Output[/align]
3
分析:
先用二分图匹配匈牙利算法找出这n个数,然后令这些数的差值最小。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cstdlib> #define R return #define SI(x) cin>>x #define PI(x) cout<<x<<endl #define O_O(x) while(x--) #define PN system("pause") #define SIA(x,y) cin>>x>>y #define FOR(i,x,n) for(i=x;i<n;i++) #define mem(x,y) memset(x,y,sizeof(x)) using namespace std; const int maxn=110; int map[maxn][maxn]; int vis[maxn],g[maxn][maxn]; int linked[maxn]; int n; void init() { int i,j; SI(n); FOR(i,1,n+1) FOR(j,1,n+1) SI(map[i][j]); } bool dfs(int u) { int v; FOR(v,1,n+1) { if(!vis[v]&&g[u][v]) { vis[v]=true; if(!linked[v]||dfs(linked[v])) { linked[v]=u; return true; } } } return false; } bool getmax() { int cnt=0; int i,j; memset(linked,0,sizeof(linked)); FOR(i,1,n+1) { memset(vis,false,sizeof(vis)); if(!dfs(i)) return false; } return true; } int solve() { int min,max,ans,x,y; FOR(ans,0,101) FOR(min,0,101-ans) { max=min+ans; memset(g,false,sizeof(g)); FOR(y,1,n+1) FOR(x,1,n+1) if(map[y][x]>=min&&map[y][x]<=max) g[y][x]=true; if(getmax()) R ans; } } int main() { int T; SI(T); O_O(T) { init(); PI(solve()); } // PN; R 0; }
相关文章推荐
- ListView的item实现滑动、点击、长按不冲突
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
- 线程和进程的比较
- 关于"是否需要有代码规范"的个人看法
- 「学习笔记」3.23代码学习
- 华为OJ--小明的筷子
- java 获取两个时间相差天数
- ios使用常用正则表达式验证密码身份证手机号【转】
- Google推荐的图片加载库Glide介绍
- Ubuntu 14.04 文件服务器--samba的安装和配置
- 第4周项目5:用递归方法求解-求1*3*5*...*n的递归式
- 关于List接口的add()和set()方法
- 统计文件中的单词数、字符数和行数的程序
- 作业三:代码复审
- 作业三(2)
- maven build的常用生命周期
- ID为0和ID为1的进程
- struts2标签,整合其他大神博客
- Flyme3升级Flyme4固件损坏问题
- Python~list,tuple^_^dict,set