UVA - 1045 The Great Wall Game(二分图最佳完美匹配)
题目大意:给出棋盘上的N个点的位置。如今问将这些点排成一行或者一列。或者对角线的最小移动步数(每一个点都仅仅能上下左右移动。一次移动一个)
解题思路:暴力+二分图最佳完美匹配
#include <cstdio>
#include <cstring>
#define N 20
#define INF 0x3f3f3f3f
#define abs(x) ((x) > 0 ?
(x) : (-(x)))
#define max(a,b)((a)>(b)?
(a):(b))
#define min(a,b)((a)<(b)?
(a):(b))
struct Node {
int x, y;
}node[N];
int w[N][N], left[N], Lx[N], Ly[N], slack[N];
int ans, n;
bool S[N], T[N];
bool match(int i) {
S[i] = true;
for (int j = 1; j <= n; j++) {
if (Lx[i] + Ly[j] == w[i][j] && !T[j]) {
T[j] = true;
if (!left[j] || match(left[j])) {
left[j] = i;
return true;
}
}
else slack[j] = min(slack[j], Lx[i] + Ly[j] - w[i][j]);
}
return false;
}
void update() {
int a = 1 << 30;
for (int i = 1; i <= n; i++) if (S[i])
for (int j = 1; j <= n; j++) if (!T[j])
a = min(a, Lx[i] + Ly[i] - w[i][j]);
for (int i = 1; i <= n; i++) {
if (S[i]) Lx[i] -= a;
if (T[i]) Ly[i] += a;
}
}
void KM() {
for (int i = 1; i <= n; i++) {
left[i] = Ly[i] = 0;
Lx[i] = -INF;
for (int j = 1; j <= n; j++)
Lx[i] = max(Lx[i], w[i][j]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
slack[j] = INF;
for (;;) {
for (int j = 1; j <= n; j++) S[j] = T[j] = 0;
if (match(i)) break;
int a = INF;
for (int j = 1; j <= n; j++)
if (!T[j])
a = min(a, slack[j]);
for (int j = 1; j <= n; j++) {
if (S[j]) Lx[j] -= a;
if (T[j]) Ly[j] += a;
}
}
}
int t = 0;
for (int i = 1; i <= n; i++)
t += Lx[i] + Ly[i];
ans = max(ans, t);
}
void init() {
for (int i = 1; i <= n; i++)
scanf("%d%d", &node[i].x, &node[i].y);
}
int cas = 1;
void solve() {
ans = -INF;
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
w[i][k] = abs(node[i].x - j) + abs(node[i].y - k);
w[i][k] = -w[i][k];
}
}
KM();
}
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++) {
w[i][k] = abs(node[i].x - k) + abs(node[i].y - j);
w[i][k] = -w[i][k];
}
KM();
}
for (int j = 1; j <= n; j++)
for (int i = 1; i <= n; i++) {
w[i][j] = abs(node[i].x - j) + abs(node[i].y - j);
w[i][j] = -w[i][j];
}
KM();
for (int j = 1; j <= n; j++)
for (int i = 1; i <= n; i++) {
w[i][j] = abs(node[i].x - j) + abs(node[i].y - (n - j + 1));
w[i][j] = -w[i][j];
}
KM();
printf("Board %d: %d moves required.\n\n", cas++, abs(ans));
}
int main() {
while (scanf("%d", &n) != EOF && n) {
init();
solve();
}
return 0;
}
UVA - 1045 The Great Wall Game(二分图最佳完美匹配)的更多相关文章
- UVa 11383 少林决胜(二分图最佳完美匹配)
https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...
- UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)
UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- Ants(二分图最佳完美匹配)
Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6904 Accepted: 2164 Special Ju ...
- 【LA4043 训练指南】蚂蚁 【二分图最佳完美匹配,费用流】
题意 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接一条线段. 分析 结点分黑白,很容易想到二分图.其中每个白点对应一个X结 ...
- Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...
- UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- ZOJ-3933 Team Formation (二分图最佳完美匹配)
题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...
- 【LA2238 训练指南】固定分区内存管理 【二分图最佳完美匹配,费用流】
题意 早期的多程序操作系统常把所有的可用内存划分为一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小.给定一些程序,操作系统需要给每个程序分配一个区域,使得他们可以同时执 ...
- HDU_2255 二分图最佳完美匹配 KM匈牙利算法
一开始还没看懂这个算法,后来看了陶叔去年的PPT的实例演示才弄懂 用一个lx[]和ly[]来记录X和Y集合中点的权值,有个定理是 lx[i]+ly[j]==w[i][j](边权值) 则该点是最佳匹配, ...
随机推荐
- Flask获取post提交数据
完成示例 # flask 代码 from flask import Flask,request ... @app.route('/get_tasks',methods=["POST" ...
- TYVJ 1305 最大子序和 ++ 烽火传递
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- 【NOIP2016游记】
day-5:上午看了火箭打马刺 火箭差点翻盘但老大爷们还是稳 下午一场五校 T1T2原题做过 T3分块 day-4:上午五校1小时写3道暴力 2个半小时优化 然而还不知道拿了多少 %%%CC T2树链 ...
- 标准C程序设计七---120
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- udp 多播2
11.3 多播 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常 ...
- Requery,Refresh,Adoquery.Close,Open 区别
经过测试发现: Requery 相当于 Adq.Close,Open:并且比Close,Open方法有个优点就是不丢失排序,Sort Adq.Close,Open 后,原来的 Adq.Sort 会丢失 ...
- AC日记——小行星 洛谷 P2711
题目背景 pid=3437 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输 ...
- 域名缓存侦测(DNS Cache Snooping)技术
域名缓存侦测(DNS Cache Snooping)技术 在企业网络中,通常都会配置DNS服务器,为网络内的主机提供域名解析服务.这些DNS不仅解析自己的私有域名,还会用递归方式,请求公网的DNS解析 ...
- luogu U10783 名字被和谐了
链接 https://www.luogu.org/problem/show?pid=U10783 题目背景 众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0. 众所周知,若g既是 ...
- codevs贪吃的九头龙
传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落.有一天,有M 个 ...