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](边权值) 则该点是最佳匹配, ...
随机推荐
- python 粘包问题及解决方法
一粘包 TCP协议是面向对象的,面向流的,提高可靠性服务.使用了优化算法,Nagle算法.将多次间隔较少且数据量小的数据,合并成一个大的数据块,然后进行封包.这样接收端就很难分辨出来.TCP协议数据是 ...
- jrebel 激活
jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b ...
- P1340 送礼物
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...
- 解决 unresolved external symbol 无法解析 _send@16(转)
(1) vc网络编程中遇到一个编译问题,原来是少了WSOCK32.LIB. 在 project-->settings-->Link-->Object/Library modules ...
- RTSP、 RTMP、HTTP的共同点、区别(转)
共同点: 1:RTSP.RTMP.HTTP都是在应用层. 2:理论上RTSP.RTMP.HTTP都可以做直播和点播,但一般做直播用RTSP.RTMP,做点播用HTTP.做视频会议的时候原来用SIP协议 ...
- bootstrapTable 应用小例(收索)
<script src="/plugins/My97DatePicker/WdatePicker.js"></script> <!-- Content ...
- Day 16 之二 省市县三级联动
摘录自:雨神,供参考! province_dic = { "河北": { "石家庄": ["鹿泉", "藁城", &qu ...
- C#学习笔记---区分StringWriter(Reader)和StreamWriter(Reader),TextWriter(Reader),BinaryWriter(Reader)
1.TextWriter(Reader)分别是对连续字符系列处理的编写器(读写器),来自System.IO 2.StringWriter(Reader)继承TextWriter(Reader),它主要 ...
- Drupal 有用的模块
投票模块drigg https://www.drupal.org/project/drigg
- AC日记——[USACO11DEC]牧草种植Grass Planting 洛谷 P3038
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...