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 ...
随机推荐
- Django 发送电子邮件
官方片段: 虽然Python使得通过smtplib 模块发送电子邮件相对容易,但Django提供了一些轻量级包装.提供这些包装器是为了使发送电子邮件更加快速,以便在开发过程中轻松测试电子邮件发送,并为 ...
- IDEA指定启动JDK版本
使用场景: 开发人员在自己的机器上可能装了多个版本的JDK,但是在环境变量中只能配置一个 JAVA_HOME ,so你的IDEA Eclipse 可能因为你在 JAVA_HOME 配置JDK1.8 以 ...
- Nginx之基本介绍(一)
这是一篇介绍Nginx基本信息和配置文件详情的文章,适合入门者,如果你想深入了解Nginx请绕道 什么是Nginx? Nginx是轻量级,高性能,跨平台的web服务器 Nginx的特点 更快 单个请求 ...
- tensorflow入门笔记(三) tf.GraphKeys
tf.GraphKeys类存放了图集用到的标准名称. 该标准库使用各种已知的名称收集和检索图中相关的值.例如,tf.Optimizer子类在没有明确指定待优化变量的情况下默认优化被收集到tf.Grap ...
- java 集合(四)HashSet 与 LinkedHashSet
查看源码: HashSet底层new 了HashMap 哈希表的结构: Demo: package cn.sasa.demo2; import java.util.HashSet; import ja ...
- 批量查询"_mget"
1.不同index的批量查询GET /_mget{ "docs":[{ "_index":"test_index1", "_typ ...
- DNS搜索
dig(Domain Information Groper) dig @dnsserver name querytype 如果你设置的dnsserver是一个域名,那么dig会首先通过默认的上连DNS ...
- vscode 使用iView时标签报错 Parsing error: x-invalid-end-tag
错误展示: 问题原因: iView将标签渲染为原生html标签时,由于这些标签是自闭合的,所以有end标签会报错. 解决方案: 修改配置文件,忽略该项检查: 根目录下 - .eslintrc.js - ...
- (1.12)SQL优化——mysql表名、库名大小写敏感
mysql表名.库名大小写敏感 关键词:mysql大小写敏感
- android TableLayOut画表格
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content& ...