LA3276
费用流
这种棋盘模型大概都是网络流吧
首先我们知道棋子之间不会影响到达目标的步数,那么就好做了,枚举终点,然后就是最小权匹配了,因为就是寻找总和最小,然后费用流就行了。
#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 0x3f3f3f3f;
struct data {
int x, y;
} a[N];
struct edge {
int nxt, to, f, c;
} e[N * N];
int n, S, T, tot, cnt = , ans, kase;
int head[N], dis[N], q[N], Map[N][N], pree[N], prevv[N], inq[N];
void link(int u, int v, int f, int c)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
e[cnt].c = c;
}
void insert(int u, int v, int f, int c)
{
link(u, v, f, c);
link(v, u, , -c);
}
bool spfa()
{
int l = , r = ;
memset(dis, 0x3f3f, sizeof(dis));
dis[] = ;
q[++r] = ;
while(l <= r)
{
int u = q[l++];
inq[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && dis[e[i].to] > dis[u] + e[i].c)
{
pree[e[i].to] = i;
prevv[e[i].to] = u;
dis[e[i].to] = dis[u] + e[i].c;
if(!inq[e[i].to])
{
inq[e[i].to] = ;
q[++r] = e[i].to;
}
}
}
return dis[T] != 0x3f3f3f3f;
}
int getflow()
{
int now = T, delta = inf;
while(now)
{
delta = min(delta, e[pree[now]].f);
now = prevv[now];
}
now = T;
while(now)
{
e[pree[now]].f -= delta;
e[pree[now] ^ ].f += delta;
now = prevv[now];
}
return delta * dis[T];
}
int maxcostflow()
{
int ret = ;
while(spfa()) ret += getflow();
return ret;
}
void build()
{
memset(head, , sizeof(head));
cnt = ;
for(int i = ; i <= n; ++i) insert(S, i, , );
for(int i = ; i <= n; ++i)
for(int x = ; x <= n; ++x)
for(int y = ; y <= n; ++y) if(Map[x][y])
insert(i, Map[x][y], , abs(a[i].x - x) + abs(a[i].y - y));
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j) if(Map[i][j])
insert(Map[i][j], T, , );
}
int main()
{
while(scanf("%d", &n))
{
if(!n) break;
T = * n + ;
ans = inf;
for(int i = ; i <= n; ++i) scanf("%d%d", &a[i].x, &a[i].y);
for(int i = ; i <= n; ++i)
{
memset(Map, , sizeof(Map));
tot = n;
for(int j = ; j <= n; ++j) Map[i][j] = ++tot;
build();
ans = min(ans, maxcostflow());
memset(Map, , sizeof(Map));
tot = n;
for(int j = ; j <= n; ++j) Map[j][i] = ++tot;
build();
ans = min(ans, maxcostflow());
}
memset(Map, , sizeof(Map));
tot = n;
for(int i = ; i <= n; ++i) Map[i][i] = ++tot;
build();
ans = min(ans, maxcostflow());
memset(Map, , sizeof(Map));
tot = n;
for(int i = ; i <= n; ++i) Map[i][n - i + ] = ++tot;
build();
ans = min(ans, maxcostflow());
printf("Board %d: %d moves required.\n\n", ++kase, ans);
}
return ;
}
LA3276的更多相关文章
随机推荐
- html——a标签中target属性
有 4 个保留的目标名称用作特殊的文档重定向操作: _blank 浏览器总在一个新打开.未命名的窗口中载入目标文档. _self 这个目标的值对所有没有指定目标的 <a> 标签是默认目标, ...
- phpCURL抓取网页内容
参考代码1:<?php // 创建一个新cURL资源 $ch = curl_init(); // 设置URL和相应的选项 curl_setopt($ch, CURLOPT_URL, " ...
- Centos6.6 安装nfs网络文件系统
一.介绍 nfs网络文件系统的,大部分用在内网文件共享,比如,对集群上传文件做共享,经常用在图片部分,当然数据量大了还是要做分离,做为专门的接口比较好,介绍一下基本安装环境: 1)Cnetos6.6 ...
- c# winform中使用WebKit实现网页与winform的交互
1.工作 一年多了,一直没对自己在工作遇到的问题进行总结,每次遇到问题都要在网上找资料,导致完成项目之后,时间久了就会生疏.所以下定 决定总结自己在工作中遇到的各种问题. 进入正题:第一次写还请大神多 ...
- Python os模块和time模块 day4
一.os模块 print(os.listdir(r'/Users/smh/Desktop/整理'))#os.listdir() 列出某个目录下面的文件夹/文件 print(os.path.isfile ...
- python 简单简绍以及简单的语法
一.Pthon介绍 Pyhton的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆在阿姆斯特丹打发时间,决心开发一款新的脚本解释程序,作为ABC语言的 ...
- react 子组件调用父组件方法
import React from 'react'import '../page1/header.css'import { Table } from 'antd'import Child from ' ...
- Mapreduce代码疑点(1)
一.Hadoop MultipleInputs.addInputPath 读取多个路径 https://blog.csdn.net/t1dmzks/article/details/76473905 M ...
- c++ list双向链表管理对象
#cat list.cc #include <cstdlib> #include <iostream> #include <stdio.h> using names ...
- Linux:文本处理工具
闲话少说,列出工具: ========================这些是查看文本用的=========================== 1,cat 用法:cat >f1 直接创建或覆盖 ...