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的更多相关文章
随机推荐
- JSP学习笔记 - 内置对象 Request
1.主要掌握以下5个内置对象及其所属类,必须学会在java docs里根据类名查找相应的方法 request javax.servlet.http.HttpServletRequest res ...
- js取自定义data属性
//20170329 原本以为只能attr或者prop来获取属性,但是今天看别人的代码他自定义了一个属性,却取不到他的属性值,我自己在本地又可以取到,难道是phtml的原因,于是我到网上查找,发现了一 ...
- DOM节点的获取
document.getElementById();//id名,在实际开发中较少使用,选择器中多用class id一般只用在顶级层存在 不能太过依赖id document.getElements ...
- CentOS / RHEL 7 : Chrony V/s NTP (Differences Between ntpd and chronyd)
CentOS / RHEL 7 : Chrony V/s NTP (Differences Between ntpd and chronyd) Chosing between Chrony and N ...
- centos中安装jdk
1.上传jdk安装文件到根目录 2.解压到相关目录 (1)创建相应目录mkdir -p /usr/local/java (2)解压 tar -zxvf jdk-7u80-linux-x64.tar.g ...
- oracle 增量导出/导入
一. 导出/导入(Export/Import) ---- 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回Oracle数据库中去. ---- 1. ...
- kendo grid create
这种自定义的create中的函数,这个data的行为是在发送到后端之前执行的 //{ // url: "/admgr/AdUserAuthorityAdd", // dataTyp ...
- Spring MVC-处理程序映射(Handler Mapping)-Bean名称Url处理程序映射(Bean Name Url Handler Mapping)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_beannameurlhandlermapping.htm 说明:示例基于Spri ...
- PHP array_diff_ukey()
定义和用法 array_diff_ukey() 返回一个数组,该数组包括了所有出现在 array1 中但是未出现在任何其它参数数组中的键名的值.注意关联关系保留不变.与 array_diff() 不同 ...
- CF #329 D
D题,LCA是很明显的.要注意的是,因为是除法,所以最多可以除x>2的有64次,当大于64时可以直接返回0.而且注意到可能会有很多值为1的边,可以使用路径压缩,把边为1的边压缩掉,类似于并查集的 ...