[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#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
随机推荐
- PHP7 学习笔记(十)会话控制
防守打法 1.设置Cookie,[基于内存的Cookie] setcookie('Username','tinywan'); setcookie('Age','24'); 2.查看Cookie存储位置 ...
- Python学习笔记9-多线程和多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- python多进程那点事儿【multiprocessing库】
前言:项目中有个需求需要对产品的日志处理,按照产品中日志的某些字段,对日志进行再次划分.比如产品的日志中含有字段id,tag=1,现在需要把tag是基数的放到一个文件中,tag是偶数的放入一个文件中. ...
- 后台拿webshell方法(2)
在这里总结一下后台拿webshell的方法: 备份突破(在博客上有随笔介绍) 一般在后台上传文件类型受到限制,可以利用数据库备份将其上传的格式改为后门执行格式即可: asp更改为jpg jpg ...
- 20155333 2016-2017-2 《Java程序设计》第六周学习总结
20155333 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的 InputStr ...
- luogu P2627 修剪草坪
传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...
- python3中的比较函数
在py2中,比较函数是cmp,而在py3,cmp已经不存在了,Py3启用了新的比较方法 原来在py2中,a>b就会调用a对象中的__cmp__函数,而现在a>b会调用a对象中的__lt__ ...
- Java 的NIO 3个主要概念 Channel、Buffer、Selector
Java 的NIO 3个主要概念 Channel.Buffer.Selector,为何提高了性能
- iOS视频流开发(2)—视频播放
承上篇,本篇文章主要介绍iOS视频播放需要用到的类.以及他们的使用场景和开发中遇到的问题. MPMoviePlayerViewController MP简介 iOS提供MPMoviePlayerCon ...
- SpringBoot启动方式讲解和部署war项目到tomcat9
1.SpringBoot启动方式讲解和部署war项目到tomcat9简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 maven插件: &l ...