[SDOI2012]象棋
题解:
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]象棋的更多相关文章
- 题解 Luogu P2499: [SDOI2012]象棋
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...
- SDOI2012 Round1 day2 象棋(chess)解题报告
本题的难点是“移动过程中不能出现多颗棋子同时在某一格的情况”. 事实上,可以忽略此条件,因为棋子是相同的,我们可以用合法的等效方案替代一棋子越过另一棋子的情况:A.B.C三格,A能在一步走到B,B也能 ...
- HTML5学习总结——canvas绘制象棋(canvas绘图)
一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
- 简单的c#winform象棋游戏(附带源码)
算法源自网络(网络源码连接:http://www.mycodes.net/161/6659.htm) 整体思路:用二维数组构建棋盘每一个数组元素封装为一个picturebox附带若干属性(例如:棋 ...
- BZOJ 1801中国象棋 DP
1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1426 Solved: 826[Submit][ ...
- BZOJ 2705: [SDOI2012]Longge的问题
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2554 Solved: 1566[Submit][ ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
随机推荐
- ATS metric query
ATS metric query 参考:ATS metric query proxy.node.cache_hit_mem_ratio proxy.node.cache_hit_mem_ratio_a ...
- PyCharm的调试
1.设置断点 2.debug模式运行 F8 下一行代码 查看当前位置所有局部变量:print(locals()) 查看全局变量: print( ...
- 为什么还原innobackupex备份后查看到的Executed_Gtid_Set与xtrabackup_binlog_info不一致
基本环境:官方社区版MySQL 5.7.19,innobackupex version 2.4.8 一.什么不一致 1.1.不一致 首先使用下面脚本来构建Executed_Gtid_Set与xtrab ...
- mysql逗逼的.frm文件恢复数据库
mysql数据库用.frm文件进行恢复. 背景:mac系统 .frm文件 (1)打开终端:输入cd /usr/local 回车. (2)输入 ls 回车. 这时候 打开finder ---> ...
- MFC_CFileDialog_选择单一文件
场景 选择单一文件 技术点 CFileDialog CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, ...
- 【转】OpenCV对图片中的RotatedRect进行填充
函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...
- JavaScript——封装
封装:使用对象封装的好处是可以减少全局变量污染的机会,讲属性,函数都隶属一个对象. 封装前: <script> var name="foo"; //name是全局的,被 ...
- 读SRE Google运维解密有感(二)
前言 这是读“SRE Google运维解密”有感第二篇,第一篇参见 这本书最近又读了几章,结合自己的经历,有些地方真的能感同身受,有些地方也惊叹SRE充满辩证的思想,总之SRE是好一本好书,会给你很大 ...
- 【ES】学习1-入门使用
参考资料: https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_search_lite.htm 1.查询es数据的方法 ...
- LINUX UBUNTU 快捷键
一.打开关闭终端 ctrl + alt + t //打开一个新终端 shift + ctrl +n //在打开终端的情况下再打开一个新终端shift + ctrl + q //关闭一个新终端 二.文件 ...