[TJOI2013]循环格
题目
我也不知道我建了个什么图,之后随便跑了跑就过了
发现要求形成一个环,改边的方向需要\(1\)的代价
根据网络流的套路开始拆点
每个点拆成两个点,\(S\)向入点连流量为\(1\)的边,出点向\(T\)连流量为\(1\)的边
对于那些方向改变的边,费用都是\(1\),否则是\(0\)
这样为什么是对的呢,考虑一下如果形成了一个环,那么每一点的流量都会在下一个点被排掉,显然之后环才能保证所有的点的流量都被排掉
当然这道题的主流做法是利用每一个点的入度出度仅为\(1\)的性质,发挥网络流调整的特性来做的
其实本质是一样的因为图建出来是一样的
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=505;
const int inf=999999999;
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,m,S,T,num=1;
std::queue<int> q;
struct E{int v,nxt,w,f;}e[maxn*maxn];
int head[maxn],vis[maxn],d[maxn];
inline void C(int x,int y,int w,int f) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].f=f;e[num].w=w;
}
inline void add(int x,int y,int w,int f) {C(x,y,w,f),C(y,x,-1*w,0);}
char map[20][20];
int in[20][20],out[20][20];
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
inline int SPFA() {for(re int i=S;i<=T;i++) d[i]=inf,vis[i]=0;d[T]=0,q.push(T);while(!q.empty()) {int k=q.front();q.pop();vis[k]=0;for(re int i=head[k];i;i=e[i].nxt)if(e[i^1].f&&d[e[i].v]>d[k]+e[i^1].w) {d[e[i].v]=d[k]+e[i^1].w;if(!vis[e[i].v]) q.push(e[i].v),vis[e[i].v]=0;}}return d[S]<inf;
}
int dfs(int x,int now) {if(x==T||!now) return now;vis[x]=1;int flow=0,ff;for(re int i=head[x];i;i=e[i].nxt)if(!vis[e[i].v]&&e[i].f&&d[e[i].v]==d[x]+e[i^1].w){ff=dfs(e[i].v,min(e[i].f,now));if(ff<=0) continue;now-=ff,flow+=ff,e[i].f-=ff,e[i^1].f+=ff;if(!now) break;}return flow;
}
inline int check(char A) {if(A=='L') return 0;if(A=='R') return 1;if(A=='U') return 2;return 3;
}
int main() {n=read(),m=read();for(re int i=1;i<=n;i++) scanf("%s",map[i]+1);for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++) in[i][j]=++T;for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++) out[i][j]=++T;++T;for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++) add(S,in[i][j],0,1),add(out[i][j],T,0,1);for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++) map[i][j]=check(map[i][j]);for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++) for(re int k=0;k<4;k++) {int x=i+dx[k],y=j+dy[k];if(x<1) x=n;if(y<1) y=m;if(x>n) x=1;if(y>m) y=1;add(in[i][j],out[x][y],k!=map[i][j],1);}int ans=0;while(SPFA()) {vis[T]=1;while(vis[T]) {for(re int i=S;i<=T;i++) vis[i]=0;ans+=dfs(S,inf)*d[S];}}printf("%d",ans);return 0;
}
转载于:https://www.cnblogs.com/asuldb/p/10554818.html
[TJOI2013]循环格相关推荐
- 【BZOJ 3171】 [Tjoi2013]循环格
Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格 ...
- bzoj3171: [Tjoi2013]循环格(费用流)
传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...
- 2017.9.23 循环格 思考记录
终于不是失败总结了, 这个题其实还是很好分析的,由于每个格子只有一个方向,所以可以考虑每个格子选取唯一的哪个方向 (其实很多网络流的题都隐含1的条件,找到1的条件限制网络流就好想了) 然后就是自带的方 ...
- 2019年暑假慈溪集训(更新ing)
前言 换了一个地方被吊打... \(Aug\ 5th\) 今天早上\(10\)点左右出发了,中午在服务区吃饭,下午\(4\)点左右才到. 这次和\(XZY\)徐教练.\(LTL\)蓝指导.\(hl66 ...
- 省选之前的未完成的计划(截至到省选)
PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...
- [刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新
文章目录 信息汇总表格 飞行员配对方案问题 分配问题 运输问题 数字梯形问题 最小路径覆盖问题 魔术球问题 圆桌问题 试题库问题 深海机器人问题 航空路线问题 火星探险问题 太空飞行计划问题 方格取数 ...
- 每周记录(4月底停更了qvq)
1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...
- BZOJ ac100题存档
不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
最新文章
- 原生JS添加类名 删除类名
- python读取excel表格-python读写Excel表格的实例代码(简单实用)
- Unable to execute dex: Multiple dex files define异常的解决办法
- 深入理解JavaScript的变量作用域(转)
- Java多态的成员特点及优缺点详解
- c++读二进制文件结束的时候总会异常_python专题文件操作
- 程序猜价格c语言,C语言大作业:编写菜单控制猜商品价格程序
- java socket群聊_java socket来实现私聊和群聊-简易版
- vsftp.conf 配置文件详解
- PowerDesigner数据模型(CDM—PDM)
- 如何在数据库中查找和消除重复的数据?
- the road to TCPIP(1)--TCPIP详解--数据链路层
- DocFetcher CMD 启动脚本
- t450加固态硬盘教程_联想thinkpad笔记本t450s拆机加装固态硬盘及内存图解
- 自由网络-去中心化分布式网络
- JAVA基本IO操作
- 苹果CMS插件安装使用下载苹果CMS插件集合
- windows 11 锁屏壁纸路径
- 小米5s 小米6 MIUI 系统 删除温控 破解限制
- iphone ipad等苹果设备30针数据线接口定义,大家可能有用