题目链接

BZOJ3571

题解

如果知道最小乘积生成树,那么这种双权值乘积最小就是裸题了
将两权值和作为坐标,转化为二维坐标系下凸包上的点,然后不断划分分治就好了

这里求的是最小匹配值,每次找点套一个二分图最小权匹配
为什么用KM算法?因为这道题丧心病狂卡费用流QAQ

写完就A啦,十分的感人

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 75,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int n,X[maxn][maxn],Y[maxn][maxn];
int w[maxn][maxn],expa[maxn],expb[maxn],cp[maxn],visa[maxn],visb[maxn],dl[maxn];
struct point{int x,y;}ans;
inline point  operator -(const point& a,const point& b){return (point){a.x - b.x,a.y - b.y};
}
inline LL operator *(const point& a,const point& b){return 1ll * a.x * b.y - 1ll * a.y * b.x;
}
inline bool operator <(const point& a,const point& b){return 1ll * a.x * a.y == 1ll * b.x * b.y ? a.x < b.x : 1ll * a.x * a.y < 1ll * b.x * b.y;
}
bool dfs(int u){visa[u] = true;REP(i,n) if (!visb[i]){int kl = expa[u] + expb[i] - w[u][i];if (!kl){visb[i] = true;if (!cp[i] || dfs(cp[i])) {cp[i] = u; return true;}}else dl[i] = min(dl[i],kl);}return false;
}
point km(){REP(i,n) expa[i] = -INF,expb[i] = cp[i] = 0;REP(i,n) REP(j,n) expa[i] = max(expa[i],w[i][j]);REP(i,n){REP(j,n) dl[j] = INF;while (true){REP(j,n) visa[j] = visb[j] = false;if (dfs(i)) break;int kl = INF;REP(j,n) if (!visb[j]) kl = min(kl,dl[j]);REP(j,n){if (visa[j]) expa[j] -= kl;if (visb[j]) expb[j] += kl;else dl[j] -= kl;}}}point re; re.x = re.y = 0;REP(i,n) re.x += X[cp[i]][i],re.y += Y[cp[i]][i];if (re < ans) ans = re;return re;
}
void solve(point A,point B){REP(i,n) REP(j,n) w[i][j] = -((A.y - B.y) * X[i][j] + (B.x - A.x) * Y[i][j]);point C = km();if ((C - A) * (B - A) <= 0) return;solve(A,C); solve(C,B);
}
int main(){int T = read();while (T--){n = read(); ans.x = INF; ans.y = INF;REP(i,n) REP(j,n) X[i][j] = read();REP(i,n) REP(j,n) Y[i][j] = read();REP(i,n) REP(j,n) w[i][j] = -X[i][j];point A = km();REP(i,n) REP(j,n) w[i][j] = -Y[i][j];point B = km();solve(A,B);printf("%d\n",ans.x * ans.y);}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8995121.html

BZOJ3571 [Hnoi2014]画框 【分治 + KM算法】相关推荐

  1. BZOJ 3571: [Hnoi2014]画框

    3571: [Hnoi2014]画框 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 996  Solved: 561 [Submit][Status ...

  2. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

    整理的算法模板合集: ACM模板 前面好几段又在讲故事- 题目大意: a[i]表示对手的每个队伍战斗力 p[i]表示打败对手后获得的分数 b[i]表示我方第一种人的战斗力 c[i]表示我方第二种人的战 ...

  3. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  4. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了-- 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  5. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  6. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

  7. UVA 11383 Golden Tiger Claw 金虎爪(KM算法)

    题意: 给一个n*n的矩阵,每个格子中有正整数w[i][j],试为每行和每列分别确定一个数字row[i]和col[i],使得任意格子w[i][j]<=row[i]+col[j]恒成立.先输row ...

  8. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  9. 二分图最大权匹配 KM算法

    KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[i]=w[i][j]的边C(i,j)构成的子图(即相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配 基本概念 1.完备匹配 ...

  10. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. 开源中国iOS客户端学习——(五)网络通信ASI类库(1)
  2. 解决chrome 很卡的问题
  3. java编程规范换行_Java编程规范整理
  4. python double语法_python上手--基本语法和数据类型基础
  5. 第十八课 色彩样式与滤镜
  6. 快速启动栏的现实桌面快捷方式
  7. 完成AOP 顶层设计-JoinPoint
  8. Carbon和Polacode教程
  9. websockets_使用Java WebSockets,JSR 356和JSON映射到POJO的
  10. 【转】Android加密算法:AES、Base64加密算法
  11. 想转行人工智能?哈佛博士后有话说...
  12. CIF进口货物流程图_FOB、CIF和CFR,你真的了解吗?
  13. 删除Flex中TREE组建里的文件夹图标.
  14. 动态规划 分享巧克力 4794_包装|颇具艺术欣赏性的巧克力创意包装设计
  15. 客户管理系统哪个好用 crm客户管理系统排名
  16. 在Windows 2012 R2上安装Intel I217-V/I218-V网卡驱动
  17. 大厂与小厂招人的区别,看完多少有点不敢相信
  18. faster rcn固定输入图片尺寸(二)
  19. 每日一狗 · 惠比特犬
  20. 与、或、异或、按位取反

热门文章

  1. 抓包神器之Charles,常用功能都在这里了
  2. Redhat6.5中搭建Postfix邮件系统
  3. POJ3421:X-factor Chains——题解
  4. python中定制类
  5. codeforces 665A Buses Between Cities
  6. 百度竞价教程 借助百度热力图让你的效果翻10倍
  7. 部署Vista(7)——创建一个最基本的应答文件
  8. html 获取mac地址,JS获取客户端IP地址与MAC地址示例
  9. 用r语言分析janeausten_R语言相关性分析
  10. Mac Idea批量删除空行