首先贴一下这道题的BNU地址,UVA地址自己找吧。

http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=11852

题意:这道题的意思就是,给你N个棋子的坐标,这些棋子的走法是象棋中的马的走法。然后再给你N个坐标终点。

问所有的棋子走到其中一个坐标上,不能有重复,最少的步数是多少。

思路:这道题直接搜显然爆,因为他的坐标范围都是int ,所以我们就要考虑怎么处理出两个点之间的最短步数。

我直接把问题扔给队友了,然后他推出了一条公式,太神不能多说。

问题简化成给你两个点(x , y ) ,(x1 , y1),求这两个点之间最少需要多少步。

然后他经过一系列的数学推导,就搞定了。

过程我也不会,等下看代码。

然后接下来每个棋子到每个终点坐标的距离都处理出来了。

那么根据N = 15 。那么很显然状压DP就可以搞定,求出最小值。

但是考虑到每个棋子只有一个位置,那么很显然棋子和终点位置是二分图,那么很显然我们可以用最小权匹配来搞这个问题。

KM的姿势比状压优美许多。

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos(-1.0)
#define inf 1ll << 60ll
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) using namespace std; ll f(ll x,ll y) {//推出来的,太神不多说
x=abs(x);
y=abs(y);
if(x>y) {
swap(x,y);
}
if(x==0&&y==1) {
return 3;
}
if(x==2&&y==2) {
return 4;
}
ll z=max((y+1)/2ll,(x+y+2)/3ll);
if((z-x-y)&1) {
z++;
}
return z;
}
int n ;
ll x[22] , y[22] ;
ll xx[22] , yy[22] ;
ll Map[22][22] ;
ll lx[22] ,ly[22] ,linkx[22] , linky[22] ;
bool visx[22] , visy[22] ;
int find(int now){
visx[now] = 1 ;
for (int i = 0 ; i < n ; i ++ ){
if(!visy[i] && Map[now][i] - lx[now] - ly[i] == 0){
visy[i] = 1 ;
if(linky[i] == -1 || find(linky[i])){
linkx[now] = i ;
linky[i] = now ;
return 1 ;
}
}
}
return 0 ;
}
ll KM(){
mem(linkx , -1) ;
mem(linky , -1) ;
mem(ly ,0) ;
for (int i = 0 ; i < n ; i ++ ){
while(1){
mem(visx ,0) ;mem(visy , 0) ;
if(find(i))break ;
ll d = inf ;
for (int j = 0 ; j < n ; j ++ ){
if(visx[j])
for (int k = 0 ; k < n ; k ++ ){
if(!visy[k])
d = min(d , Map[j][k] - lx[j] - ly[k]) ;
}
}
for (int j = 0 ; j < n ; j ++ ){
if(visx[j])lx[j] += d ;
if(visy[j])ly[j] -= d ;
}
}
}
ll ans = 0 ;
for (int i = 0 ; i < n ; i ++ ){
if(linky[i] != -1 )ans += Map[linky[i]][i] ;
}
return ans ;
}
int main() {
int ca = 0 ;
while(cin >> n , n ){
for (int i = 0 ; i < n ; i ++ )cin >> x[i] >> y[i] ;
for (int i = 0 ; i < n ; i ++ )cin >> xx[i] >> yy[i] ;
for (int i = 0 ; i < n ; i ++ )lx[i] = inf ;
for (int i = 0 ; i < n ; i ++ ){
for (int j = 0 ; j < n ; j ++ ){
Map[i][j] = f(x[i] - xx[j] , y[i] - yy[j]) ;
lx[i] = min(lx[i] , Map[i][j]) ;
}
}
cout << ++ ca << ". " ;
cout << KM() << endl;
}
return 0 ;
}

UVALIVE 4970 最小权匹配的更多相关文章

  1. HDU(1853),最小权匹配,KM

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Other ...

  2. Poj(3686),最小权匹配,多重匹配,KM

    题目链接 The Windy's | Time Limit: 5000MS | Memory Limit: 65536K | | Total Submissions: 4939 | Accepted: ...

  3. POJ 3565 Ants (最小权匹配)

    题意 给出一些蚂蚁的点,给出一些树的点,两两对应,使他们的连线不相交,输出一种方案. 思路 一开始没想到怎么用最小权匹配--后来发现是因为最小权匹配的方案一定不相交(三角形两边之和大于第三边)--还是 ...

  4. POJ 2400 最小权匹配

    吐槽:首先,这道题的输入居然是错的.要将上下两个矩阵的位置换一下才可以出样例,也就是上面那个矩阵是employee对Supervisor的打分,下面那个矩阵才是Supervisor对employee的 ...

  5. poj 2516(拆点+最小权匹配)

    题目链接:http://poj.org/problem?id=2516 思路:考虑某种货物,由于某个订货商可能接受来自不同地区的货物,而某一地区的货物也可能送给不同的订货商,显然不能直接进行匹配,必须 ...

  6. poj 3686(拆点+最小权匹配)

    题目链接:http://poj.org/problem?id=3686 思路:显然工件为X集,机器为Y集合.由于每个机器一次只能加工一个部件,因此我们可以将一台机器拆成N个点,至于部件与机器之间连多大 ...

  7. poj 2195(KM求最小权匹配)

    题目链接:http://poj.org/problem?id=2195 思路:我们都知道KM使用来求最大权匹配的,但如果要求最小权匹配,只需把图中的权值改为负值,求一次KM,然后权值和取反即可. ht ...

  8. 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)

    [POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS   Memory Limit ...

  9. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

随机推荐

  1. Qt之自定义界面(实现无边框、可移动)

    简述 UI设计是指对软件的人机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅是让软件变得有个性.有品位,还要让软件的操作变得舒适简单.自由,充分体现软件的定位和特点. 爱美之心人皆有之.其实软件 ...

  2. CentOS6.2下fastDFS的完整安装和配置步骤

    centos6.2系统下安装配置FastDFS步骤: 1:安装libevent(libevent-2.0.16-stable) ##卸载系统自带libevent rpm -qa|grep libeve ...

  3. AI 行为树

    by AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很 ...

  4. 纯css做的安卓开机动画

    随着css3的发展,越来越多的负责绚丽的效果可以由纯css来完成了.用css3实现的动画效果丝毫不必js实现的逊色,而且浏览器对css渲染的速度远比js快,大多数时候css的体积也不js小.其中css ...

  5. POJ 3259 Wormholes 虫洞(负权最短路,负环)

    题意: 给一个混合图,求判断是否有负环的存在,若有,输出YES,否则NO.有重边. 思路: 这是spfa的功能范围.一个点入队列超过n次就是有负环了.因为是混合图,所以当你跑一次spfa时发现没有负环 ...

  6. apache开源项目-- UIMA

    UIMA (Unstructured Information Management applications) 是一个软件系统,用来分析大量的非结构化信息从而发掘中对最终用户有用的知识点,一个最典型的 ...

  7. Android裁剪固定大小头像的功能

    转载自: http://www.eoeandroid.com/thread-497277-1-1.html 效果很好,特意转载过来记录一下,加深一下印象. 效果就是 :中间的方框不动,可以拖动图片,选 ...

  8. ASP.NET MVC+Bootstrap个人博客之后台dataTable数据列表(五)

    jQuery  dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器分页.查询.格式化等功能.dataTables 官网也提供了大量的演示 ...

  9. java web 学习十四(JSP原理)

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  10. Metaspace 之二--Java 8的元空间(metaspace)、metaspace监控方法

    很多开发者都在其系统中见过“java.lang.OutOfMemoryError: PermGen space”这一问题.这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部 ...