uvalive 3276 The Great Wall Game
题意:
一个n * n的棋盘上放着n个棋子,现在要求把这n个棋子用最少的步数移到同一条直线上,即同一列同一行或者同一对角线(两条)。输出最少的步数(只能往四个方向移动,即正东,正西,正南,正北)。
思路:
每个棋子唯一对应一个格子,每个棋子不能在同一个格子,那么就相当于一个二分图(强行二分图)。
因为n很小,所以可以枚举每一行,每一列,两条对角线,然后每个点移动到每一条直线的每一个格子都有一个距离,那么这个点就向格子连一条权值为距离的边,这个问题就转化成了求所有最佳完美的匹配中的最小值,用KM算法。
因为我们求的是最小步数,所以求的是带权二分图的最小匹配。
求最小匹配,就将每一条边的权值取反,然后求最大匹配,再将最后的结果取反就得到了最小匹配的结果。
复杂度为O(n^4)。
注意:输出很坑,每一个答案后都有一个换行,并不是两个中间输出一个,也就是说,最后一个后面也有换行。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; const int N = ;
const int inf = 0x3f3f3f3f; int love[N][N];
int lx[N],ly[N];
bool visx[N],visy[N];
int match[N];
int slack[N]; struct node
{
int x,y; node(int aa,int bb)
{
x = aa;
y = bb;
}
}; vector<node> vn; int mabs(int x)
{
return x >= ? x : -x;
} bool dfs(int u,int n)
{
visx[u] = ; for (int i = ;i <= n;i++)
{
if (visy[i]) continue; int gap = lx[u] + ly[i] - love[u][i]; if (gap == )
{
visy[i] = ; if (match[i] == - || dfs(match[i],n))
{
match[i] = u;
return true;
}
}
else
{
slack[i] = min(gap,slack[i]);
}
} return false;
} int km(int n)
{
memset(match,-,sizeof(match));
memset(ly,,sizeof(ly)); for (int i = ;i <= n;i++)
{
lx[i] = love[i][]; for (int j = ;j <= n;j++)
{
lx[i] = max(lx[i],love[i][j]);
}
} for (int i = ;i <= n;i++)
{
memset(slack,inf,sizeof(slack)); while ()
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy)); if (dfs(i,n)) break; int d = inf; for (int j = ;j <= n;j++)
{
if (!visy[j]) d = min(d,slack[j]);
} for (int j = ;j <= n;j++)
{
if (visx[j]) lx[j] -= d; if (visy[j]) ly[j] += d;
}
} } int res = ; for (int i = ;i <= n;i++)
{
res += love[match[i]][i];
} return res;
} int main()
{
int n;
int kase = ; while (scanf("%d",&n) != EOF && n)
{
vn.clear(); for (int i = ;i < n;i++)
{
int a,b; scanf("%d%d",&a,&b); vn.push_back(node(a,b));
} //if (kase) printf("\n"); int ans = 1e8; for (int i = ;i <= n;i++)
{
for (int j = ;j < vn.size();j++)
{
for (int k = ;k <= n;k++)
{
int dx = mabs(vn[j].x - i);
int dy = mabs(vn[j].y - k);
love[j+][k] = -(dx + dy);
}
} int tmp = -km(n); //printf("%d **\n",tmp); ans = min(tmp,ans);
} for (int i = ;i <= n;i++)
{
for (int j = ;j < vn.size();j++)
{
for (int k = ;k <= n;k++)
{
int dy = mabs(vn[j].y - i);
int dx = mabs(vn[j].x - k);
love[j+][k] = -(dx + dy);
}
} int tmp = -km(n); ans = min(tmp,ans); //printf("%d **\n",tmp);
} for (int i = ;i <= n;i++)
{
for (int j = ;j < vn.size();j++)
{
int dx = mabs(vn[j].x - i);
int dy = mabs(vn[j].y - i); love[j+][i] = -(dx + dy);
}
} ans = min(ans,-km(n)); for (int i = ;i <= n;i++)
{
for (int j = ;j < vn.size();j++)
{
int dx = mabs(vn[j].x - i);
int dy = mabs(vn[j].y - (n - i + )); love[j+][i] = -(dx + dy);
}
} ans = min(ans,-km(n)); printf("Board %d: %d moves required.\n\n",++kase,ans);
} return ;
}
uvalive 3276 The Great Wall Game的更多相关文章
- UVALive 5097 Cross the Wall
贪心思想,$dp$,斜率优化. 首先将人按照$w$从大到小排序,如果$w$一样,按$h$从大到小排.这样一来,某位置之后,比该位置$h$小的都是不需要考虑的. 因此,形成了如下图所示的结果: 即第一个 ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- UVALive 4425 Another Brick in the Wall 暴力
C - Another Brick in the Wall Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & ...
- UVALive 2453 Wall (凸包)
题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...
- UVALive 5066 Fire Drill BFS+背包
H - Fire Drill Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
随机推荐
- win10下切换多个jdk版本
1.每次切换时,修改JAVA_HOME变量 2.编辑path环境变量,如图所示,将%JAVA_HOME%\jre\bin和%JAVA_HOME%\bin移到最上边 3.在控制面板中打开java控制面板 ...
- 关于javascript中defineProperty的学习
语法 Object.defineProperty(obj, prop, descriptor) 参数 obj 要在其上定义属性的对象. prop 要定义或修改的属性的名称. descriptor 将被 ...
- 关于 Data URI Scheme -- data:image/jpg;base64
转载一篇大神的文章 大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqA ...
- 不能往Windows Server 2008 R2 Server中复制文件的解决方法
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度找到了解决方法,特此记录(记忆). 1.在任务管理器中找到“rdpclip.e ...
- 三、Spring Boot 日志
1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...
- DNS搜索
dig(Domain Information Groper) dig @dnsserver name querytype 如果你设置的dnsserver是一个域名,那么dig会首先通过默认的上连DNS ...
- magento开发手册之目录结构
magento是一个很优秀的电商系统,很多朋友会用它部署自己的电商网站,少不了二次开发.下面我们随着ytkah来一起认识一下magento开发手册之目录结构吧. /app – 程序根目录 /app/e ...
- TCP/IP协议栈基础知识
设计思想 把一个复杂的事物进行分层划分,使得每个部分变得相对简单 分层模型 OSI分为7层模型 tcp/ip分为四层模型 应用层(Application) 传输层(Transport) 网络层(I ...
- 浅谈JS的变量提升
JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就 ...
- python的globals()
以字典的形式返回当前位置的全局变量