题解:

sd的题目也真是奇怪

第一题有了最短路第二题还有

第二题有了网络流第三题还有

显然是可以网络流的

但考虑每个点只能存在一个这个条件

刚开始我以为是建分层图。。但发现这个时间复杂度太高了

其实我们考虑当两个人到一个点的时候可以交换速度(常用思想)

所以如果有解那么这个条件就是没有用的

所以也就是说这个条件是没有用的

那就变成了二分图最大权匹配

代码:

#include <bits/stdc++.h>
#define N 40000
#define maxn 500000
using namespace std;
struct re{
int a,b,c,from,flow,cost;
}a[maxn];
struct ree{
int a,b,c;
}e[maxn];
int l2,l,head[N],head2[N];
void arr(int x,int y,int z,int flow,int cost)
{
a[++l].a=head[x];
a[l].b=y;
a[l].c=z;
a[l].flow=flow;
a[l].cost=cost;
a[l].from=x;
head[x]=l;
}
#define INF 1e9
int sum,d[N],s,t,p[N],aa[N],n,m;
bool inq[N];
bool bellmanford(int &flow,int &cost)
{
for (int i=;i<=sum;i++) d[i]=INF;
memset(inq,,sizeof(inq));
d[s]=; inq[s]=; aa[s]=INF;
queue<int>q;
q.push(s);
while (!q.empty())
{
int x=q.front(); q.pop();
int u=head[x];
while (u)
{
int v=a[u].b;
if (a[u].c>a[u].flow&&d[v]>d[x]+a[u].cost)
{
d[v]=d[x]+a[u].cost;
p[v]=u;
aa[v]=min(aa[x],a[u].c-a[u].flow);
if (!inq[v])
{
q.push(v); inq[v]=;
}
}
u=a[u].a;
}
inq[x]=;
}
if (d[t]==INF) return();
flow+=aa[t];
cost+=d[t]*aa[t];
int x=t;
while (x!=s)
{
int u=p[x];
a[u].flow+=aa[t];
if (u%) a[u+].flow-=aa[t]; else a[u-].flow-=aa[t];
x=a[u].from;
}
return ;
}
int flow,cost;
void mincost()
{
while (bellmanford(flow,cost));
}
int dx[]={,,,-,-};
int dy[]={,,-,,-};
queue<int> q;
bool ff[][];
char cc[N];
int js(int x,int y)
{
return((x-)*m+y);
}
bool pd(int x,int y)
{
if (x>=&&x<=n&&y>=&&y<=m&&!ff[x][y]) return();
else return();
}
void arr2(int x,int y)
{
e[++l2].a=head2[x];
e[l2].b=y;
head2[x]=l2;
}
int k,a1,b1;
int x1[N],x2[N],y3[N],y4[N],dis[N];
bool vis[N];
int main()
{
freopen("noi.in","r",stdin);
freopen("noi.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>n>>m>>k>>a1>>b1;
for (int i=;i<=n;i++)
{
cin>>cc;
int len=strlen(cc);
for (int j=;j<len;j++)
if (cc[j]=='*') ff[i][j+]=;
}
for (int i=;i<=k;i++)
cin>>x1[i]>>y3[i];
for (int i=;i<=k;i++)
cin>>x2[i]>>y4[i];
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (pd(i,j))
{
for (int i1=;i1<=;i1++)
{
if (pd(i+dx[i1]*a1,j+dy[i1]*b1))
{
int k1=js(i,j);
int k2=js(i+dx[i1]*a1,j+dy[i1]*b1);
arr2(k1,k2);
}
if (pd(i+dx[i1]*b1,j+dy[i1]*a1))
{
int k1=js(i,j);
int k2=js(i+dx[i1]*b1,j+dy[i1]*a1);
arr2(k1,k2);
}
}
}
sum=*k+;
for (int i=;i<=k;i++)
{
int ax1=js(x1[i],y3[i]);
for (int j=;j<=n*m;j++)
dis[j]=INF;
memset(vis,,sizeof(vis));
dis[ax1]=; q.push(ax1); vis[ax1]=;
while (!q.empty())
{
int x2=q.front(); q.pop();
int u=head2[x2];
while (u)
{
int v=e[u].b;
if (!vis[v])
{ dis[v]=dis[x2]+;
q.push(v);
vis[v]=;
}
u=e[u].a;
}
}
for (int j=;j<=k;j++)
{
int ax2=js(x2[j],y4[j]);
arr(i,j+k,,,dis[ax2]);
arr(j+k,i,,,-dis[ax2]);
}
}
s=; t=*k+;
for (int i=;i<=k;i++)
{
arr(s,i,,,); arr(i,s,,,);
arr(i+k,t,,,); arr(t,i+k,,,);
}
mincost();
cout<<cost;
return ;
}

[SDOI2012]象棋的更多相关文章

  1. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  2. SDOI2012 Round1 day2 象棋(chess)解题报告

    本题的难点是“移动过程中不能出现多颗棋子同时在某一格的情况”. 事实上,可以忽略此条件,因为棋子是相同的,我们可以用合法的等效方案替代一棋子越过另一棋子的情况:A.B.C三格,A能在一步走到B,B也能 ...

  3. HTML5学习总结——canvas绘制象棋(canvas绘图)

    一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...

  4. 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)

    目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...

  5. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  6. 简单的c#winform象棋游戏(附带源码)

    算法源自网络(网络源码连接:http://www.mycodes.net/161/6659.htm)   整体思路:用二维数组构建棋盘每一个数组元素封装为一个picturebox附带若干属性(例如:棋 ...

  7. BZOJ 1801中国象棋 DP

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1426  Solved: 826[Submit][ ...

  8. BZOJ 2705: [SDOI2012]Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2554  Solved: 1566[Submit][ ...

  9. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

随机推荐

  1. ubuntu16.04.1下安装mysql

    版本信息 ubuntu版本:16.04.1 mysql-server版本:5.7.23 安装 先查看一下apt可获取的mysql版本 ubuntu@VM-0-4-ubuntu:~$ apt searc ...

  2. PHP第三方登录—OAuth2.0协议

    第2章 OAuth授权流程详解 

  3. webuploader

    https://www.cnblogs.com/study-fanzeng/p/8930939.html http://fex.baidu.com/webuploader/doc/index.html ...

  4. IPv4套接字地址结构

    一.IPv4套接字地址结构(POSIX定义) (1)长度字段sin_len是为增加对OSI协议的支持而随4.3BSD-Reno添加的:并不是所有的厂家都支持套接字地址结构的长度字段,而且POSIX规范 ...

  5. zabbix 在图形中显示网络设备的接口描述

    zabbix原始模板没有提供来显示网络设备接口的描述,我们通常看到的图形显示是下面这样的: zabbix 3之后图形显示变化蛮大的,但我们乍一看,并不知道这个ethernet0/1是什么接口,网络设备 ...

  6. DBeaver入门

    1 安装好连接好数据库,查询操作 注意黄色字体1 2 3 4 执行sql操作

  7. B - Birthday Boy Gym - 102007B

    题目链接:https://cn.vjudge.net/contest/283924#problem/B 题目大意:给你n个人的信息,让你找出一个时间,要求让你选择一天,使得这一天的前一个生日距离它最远 ...

  8. python - getattr 与 getattribute 机制

    #__getattribute__ class Foo(): def __init__(self,name): self.name = name def __getattr__(self, item) ...

  9. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException

    报错如下: The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcach ...

  10. Jetson tk1 刷机后要做的几件事

    参考简书文章: http://www.jianshu.com/p/997ede860d74 1. 查看Jetson TK1 L4T版本 head -n 1 /etc/nv_tegra_release ...