【BZOJ3171】[TJOI2013] 循环格(网络流)
大致题意: 给你一个循环格,每个格子有一个方向。问你至少修改多少格子,才能使从每个格子出发都能回到原格子。
建图
这是道网络流题目,主要就是考虑如何建图。
我们可以把每个点拆成两个点,一个入点,一个出点。
连边有以下两种:
- 超级源向每个点出点、每个点入点向超级汇连一条容量为\(1\),代价为\(0\)的边。
- 每个点出点向这个点在矩阵中相邻的点的入点连一条容量为\(1\)的边,若方向与格子原先方向相同,代价为\(0\),不同时代价为\(1\)。
然后跑最小费用最大流就可以了。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 15
#define INF 1e9
using namespace std;
int n,m;char a[N+5][N+5];
template<int PS,int ES> class Dinic//最小费用最大流
{
private:
#define Else(x) ((((x)-1)^1)+1)
#define add(x,y,f,c) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].F=f,e[ee].C=c)
int ee,lnk[PS+5],lst[PS+5],Iq[PS+5],F[PS+5],C[PS+5];queue<int> q;
struct edge {int to,nxt,F,C;}e[2*ES+5];
I bool SPFA()//SPFA找增广路
{
RI i,k;for(i=1;i<=2*n*m+2;++i) F[i]=C[i]=INF;C[S]=0,q.push(S),Iq[S]=1;
W(!q.empty())
{
for(Iq[k=q.front()]=0,q.pop(),i=lnk[k];i;i=e[i].nxt) e[i].F&&C[k]+e[i].C<C[e[i].to]&&
(
C[e[i].to]=C[k]+e[lst[e[i].to]=i].C,F[e[i].to]=min(F[k],e[i].F),
!Iq[e[i].to]&&(q.push(e[i].to),Iq[e[i].to]=1)
);
}return F[T]!=INF;
}
public:
int S,T;I Dinic() {S=1,T=2;}
I int PI(CI x,CI y) {return (x-1)*m+y+2;}I int PO(CI x,CI y) {return (x+n-1)*m+y+2;}
I void Add(CI x,CI y,CI f,CI c) {add(x,y,f,c),add(y,x,0,-c);}//连边
I void Solve()
{
RI x,t=0;W(SPFA())
{
x=T,t+=F[T]*C[T];//统计最小费用
W(x^S) e[lst[x]].F-=F[T],e[Else(lst[x])].F+=F[T],x=e[Else(lst[x])].to;//修改源到汇路径上的残量
}printf("%d",t);//输出最小费用
}
};Dinic<2*N*N+2,6*N*N> D;
int main()
{
RI i,j;for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%s",a[i]+1);
for(i=1;i<=n;++i) for(j=1;j<=m;++j)
#define lst(x,t) ((x)^1?(x)-1:(t))
#define nxt(x,t) ((x)^(t)?(x)+1:1)
D.Add(D.S,D.PO(i,j),1,0),D.Add(D.PI(i,j),D.T,1,0),//与超级源、超级汇连边
D.Add(D.PO(i,j),D.PI(lst(i,n),j),1,a[i][j]!='U'),//与相邻点连边
D.Add(D.PO(i,j),D.PI(nxt(i,n),j),1,a[i][j]!='D'),//与相邻点连边
D.Add(D.PO(i,j),D.PI(i,lst(j,m)),1,a[i][j]!='L'),//与相邻点连边
D.Add(D.PO(i,j),D.PI(i,nxt(j,m)),1,a[i][j]!='R');//与相邻点连边
return D.Solve(),0;
}
【BZOJ3171】[TJOI2013] 循环格(网络流)的更多相关文章
- BZOJ3171 Tjoi2013 循环格
传送门 Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头 ...
- bzoj3171: [Tjoi2013]循环格(费用流)
传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...
- Bzoj 3171: [Tjoi2013]循环格 费用流
3171: [Tjoi2013]循环格 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 741 Solved: 463[Submit][Status][ ...
- [Tjoi2013]循环格
[Tjoi2013]循环格 2014年3月18日1,7500 Description Input 第一行两个整数R,C.表示行和列,接下来R行,每行C个字符LRUD,表示左右上下. Output 一个 ...
- 洛谷 P3965 [TJOI2013]循环格 解题报告
P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...
- BZOJ_3171_[Tjoi2013]循环格_最小费用最大流
BZOJ_3171_[Tjoi2013]循环格_最小费用最大流 Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为 ...
- [TJOI2013]循环格 费用流 BZOJ3171
题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位(r,c),你可以沿着箭头方向在格子间行走.即:如果 ...
- 【bzoj3171】[Tjoi2013]循环格
题目描述: 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格子间行走.即 ...
- 【BZOJ 3171】 [Tjoi2013]循环格
Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c) ,你可以沿着箭头防线在格 ...
随机推荐
- Python 列表生成式 & 字典生成式
Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...
- 一些你不知道的css特性【一】
浏览器禁止用户在标签的style中使用js写入"!important"的特性 我们在使用jQuery设置css的时候 $('#text').css('height', '200px ...
- spring cloud 2.x版本 Sleuth+Zipkin分布式链路追踪
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- 使用requests模块进行封装,帮你如何处理restful类型的接口
import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) c ...
- 【洛谷5008】逛庭院(Tarjan,贪心)
[洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...
- Netty — 线程模型
一.前言 众所周知,netty是高性能的原因源于其使用的是NIO,但是这只是其中一方面原因,其IO模型上决定的.另一方面源于其线程模型的设计,良好的线程模型设计,能够减少线程上下文切换,减少甚至避免锁 ...
- Redis for OPS 07:Redis 补充说明
写在前面的话 redis 的各种架构搭建暂时就到这里,本文主要用于补充说明 Redis 的一些概念以及配置文件的相关信息. 常用词汇 缓存穿透: 类似热点数据存储 Redis 一样,对于非热点数据存储 ...
- SpringBoot中数据加密存储和获取后解密展示AttributeConverter的实现
1. 需求: 数据库存入数据的时候要加密处理,不同的字段加密方式不同. 界面上展示的时候要解密处理,解密方式相同. 2. 实现方案一: 定义公共的加密解密方法,然后在对应的字段上重写他的getset方 ...
- Java开发桌面程序学习(四)——常用应用布局模板和简单分析
布局 前言 刚开始的时候,不知道使用什么布局,发现SceneBuilder其实有8.5版本的,里面就是有提供一个简单的桌面程序模板,8.5可以去官网下载,不过网速好像有点慢,慢慢等吧,官网下载地址 布 ...
- 如何让Python爬虫一天抓取100万张网页
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 源自:猿人学Python PS:如有需要Python学习资料的 ...