二分图_HDU_2236
来源:互联网 发布:淘宝客邮件推广 编辑:程序博客网 时间:2024/06/05 16:23
心好累,wa成狗,推代码重写过了
选择行列,二分图的性质,选择匹配
要差值最大
二分答案,枚举最小值
为何区间不是成功向上移而是失败向上移呢?[ma,ma+ans]的区块,如果匹配不到,说明范围太小,加大ans,故上移,
#include<iostream>#include<cstring>#include<cstdio>const int maxn = 105;using namespace std;int map[maxn][maxn],n;int Max, Min,l,r,ma,mid;int link[maxn],vis[maxn];int Find(int x){ for(int i = 1; i <= n; i++) { if(!vis[i]&&map[x][i]>=ma&&map[x][i]<=ma+mid) { vis[i] = 1; if(link[i]==-1||Find(link[i])) { link[i] = x; return 1; } } } return 0;}int can(){ memset(link, -1,sizeof(link)); for(int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if(!Find(i)) return 0; } return 1;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d",&n); Max = -101;Min = 100; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d",&map[i][j]); if(map[i][j]>Max)Max = map[i][j]; if(map[i][j]<Min)Min = map[i][j]; } } l = 0;r = Max - Min; while(1) { bool flag = false; mid = (l+r)>>1; for(ma = Min; ma+mid<=Max; ma++) { if(can()) { flag = true; break; } } if(l == mid)break; if(!flag) l = mid; else r = mid; } printf("%d\n",r); } return 0;}
0 0
- 二分图_HDU_2236
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- 二分图
- ##二分图##
- 二分图
- 二分图
- 二分图
- hdu1100 Trees Made to Order
- Attack on Titan(状态压缩)
- andorid用到的常见的Java设计模式
- Windows Phone 学习 直接在手机中选择照片并且显示
- Android 4.0屏蔽状态栏(已解决)
- 二分图_HDU_2236
- java 反射
- 从输入url到显示网页,后台发生了什么?
- wp学习
- Windows Phone 学习 直接保存联系人到手机上
- C++ C# VC VC.net以及VC++有什么区别和联系?
- 欢迎使用CSDN-markdown编辑器
- 走出泥淖,定好目标且专注才会变得优秀!
- Cocos2d-X使用CCAnimation创建动画