题目

我也不知道我建了个什么图,之后随便跑了跑就过了

发现要求形成一个环,改边的方向需要\(1\)的代价

根据网络流的套路开始拆点

  1. 每个点拆成两个点,\(S\)向入点连流量为\(1\)的边,出点向\(T\)连流量为\(1\)的边

  2. 对于那些方向改变的边,费用都是\(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]循环格相关推荐

  1. 【BZOJ 3171】 [Tjoi2013]循环格

    Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格 ...

  2. bzoj3171: [Tjoi2013]循环格(费用流)

    传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...

  3. 2017.9.23 循环格 思考记录

    终于不是失败总结了, 这个题其实还是很好分析的,由于每个格子只有一个方向,所以可以考虑每个格子选取唯一的哪个方向 (其实很多网络流的题都隐含1的条件,找到1的条件限制网络流就好想了) 然后就是自带的方 ...

  4. 2019年暑假慈溪集训(更新ing)

    前言 换了一个地方被吊打... \(Aug\ 5th\) 今天早上\(10\)点左右出发了,中午在服务区吃饭,下午\(4\)点左右才到. 这次和\(XZY\)徐教练.\(LTL\)蓝指导.\(hl66 ...

  5. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  6. [刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新

    文章目录 信息汇总表格 飞行员配对方案问题 分配问题 运输问题 数字梯形问题 最小路径覆盖问题 魔术球问题 圆桌问题 试题库问题 深海机器人问题 航空路线问题 火星探险问题 太空飞行计划问题 方格取数 ...

  7. 每周记录(4月底停更了qvq)

    1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...

  8. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  9. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

最新文章

  1. 原生JS添加类名 删除类名
  2. python读取excel表格-python读写Excel表格的实例代码(简单实用)
  3. Unable to execute dex: Multiple dex files define异常的解决办法
  4. 深入理解JavaScript的变量作用域(转)
  5. Java多态的成员特点及优缺点详解
  6. c++读二进制文件结束的时候总会异常_python专题文件操作
  7. 程序猜价格c语言,C语言大作业:编写菜单控制猜商品价格程序
  8. java socket群聊_java socket来实现私聊和群聊-简易版
  9. vsftp.conf 配置文件详解
  10. PowerDesigner数据模型(CDM—PDM)
  11. 如何在数据库中查找和消除重复的数据?
  12. the road to TCPIP(1)--TCPIP详解--数据链路层
  13. DocFetcher CMD 启动脚本
  14. t450加固态硬盘教程_联想thinkpad笔记本t450s拆机加装固态硬盘及内存图解
  15. 自由网络-去中心化分布式网络
  16. JAVA基本IO操作
  17. 苹果CMS插件安装使用下载苹果CMS插件集合
  18. windows 11 锁屏壁纸路径
  19. 小米5s 小米6 MIUI 系统 删除温控 破解限制
  20. iphone ipad等苹果设备30针数据线接口定义,大家可能有用

热门文章

  1. 解决PLSQL Developer 9连接oracle10g出现乱码
  2. 查看mysql当前表使用的存储引擎(转)
  3. mybatis学习笔记(3)-入门程序一
  4. Java 复习 —— JMM基础
  5. 基于.net3.5以上XML操作.
  6. 性能测试知多少--系统计数器与硬件分析
  7. [转]数据库开发21条军规
  8. shiro登陆流程源码详解
  9. 47.2. 配置 Tomcat 服务器
  10. 1119: 零起点学算法26——判断奇偶数