点此看题面

大致题意: 给你一个循环格,每个格子有一个方向。问你至少修改多少格子,才能使从每个格子出发都能回到原格子。

建图

这是道网络流题目,主要就是考虑如何建图。

我们可以把每个点拆成两个点,一个入点,一个出点。

连边有以下两种:

  • 超级源向每个点出点、每个点入点向超级汇连一条容量为\(1\),代价为\(0\)的边。
  • 每个点出点向这个点在矩阵中相邻的点的入点连一条容量为\(1\)的边,若方向与格子原先方向相同,代价为\(0\),不同时代价为\(1\)。

然后跑最小费用最大流就可以了。

代码

  1. #include<bits/stdc++.h>
  2. #define Tp template<typename Ty>
  3. #define Ts template<typename Ty,typename... Ar>
  4. #define Reg register
  5. #define RI Reg int
  6. #define Con const
  7. #define CI Con int&
  8. #define I inline
  9. #define W while
  10. #define N 15
  11. #define INF 1e9
  12. using namespace std;
  13. int n,m;char a[N+5][N+5];
  14. template<int PS,int ES> class Dinic//最小费用最大流
  15. {
  16. private:
  17. #define Else(x) ((((x)-1)^1)+1)
  18. #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)
  19. int ee,lnk[PS+5],lst[PS+5],Iq[PS+5],F[PS+5],C[PS+5];queue<int> q;
  20. struct edge {int to,nxt,F,C;}e[2*ES+5];
  21. I bool SPFA()//SPFA找增广路
  22. {
  23. 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;
  24. W(!q.empty())
  25. {
  26. 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]&&
  27. (
  28. C[e[i].to]=C[k]+e[lst[e[i].to]=i].C,F[e[i].to]=min(F[k],e[i].F),
  29. !Iq[e[i].to]&&(q.push(e[i].to),Iq[e[i].to]=1)
  30. );
  31. }return F[T]!=INF;
  32. }
  33. public:
  34. int S,T;I Dinic() {S=1,T=2;}
  35. 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;}
  36. I void Add(CI x,CI y,CI f,CI c) {add(x,y,f,c),add(y,x,0,-c);}//连边
  37. I void Solve()
  38. {
  39. RI x,t=0;W(SPFA())
  40. {
  41. x=T,t+=F[T]*C[T];//统计最小费用
  42. W(x^S) e[lst[x]].F-=F[T],e[Else(lst[x])].F+=F[T],x=e[Else(lst[x])].to;//修改源到汇路径上的残量
  43. }printf("%d",t);//输出最小费用
  44. }
  45. };Dinic<2*N*N+2,6*N*N> D;
  46. int main()
  47. {
  48. RI i,j;for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%s",a[i]+1);
  49. for(i=1;i<=n;++i) for(j=1;j<=m;++j)
  50. #define lst(x,t) ((x)^1?(x)-1:(t))
  51. #define nxt(x,t) ((x)^(t)?(x)+1:1)
  52. D.Add(D.S,D.PO(i,j),1,0),D.Add(D.PI(i,j),D.T,1,0),//与超级源、超级汇连边
  53. D.Add(D.PO(i,j),D.PI(lst(i,n),j),1,a[i][j]!='U'),//与相邻点连边
  54. D.Add(D.PO(i,j),D.PI(nxt(i,n),j),1,a[i][j]!='D'),//与相邻点连边
  55. D.Add(D.PO(i,j),D.PI(i,lst(j,m)),1,a[i][j]!='L'),//与相邻点连边
  56. D.Add(D.PO(i,j),D.PI(i,nxt(j,m)),1,a[i][j]!='R');//与相邻点连边
  57. return D.Solve(),0;
  58. }

【BZOJ3171】[TJOI2013] 循环格(网络流)的更多相关文章

  1. BZOJ3171 Tjoi2013 循环格

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

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

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

  3. Bzoj 3171: [Tjoi2013]循环格 费用流

    3171: [Tjoi2013]循环格 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 741  Solved: 463[Submit][Status][ ...

  4. [Tjoi2013]循环格

    [Tjoi2013]循环格 2014年3月18日1,7500 Description Input 第一行两个整数R,C.表示行和列,接下来R行,每行C个字符LRUD,表示左右上下. Output 一个 ...

  5. 洛谷 P3965 [TJOI2013]循环格 解题报告

    P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...

  6. BZOJ_3171_[Tjoi2013]循环格_最小费用最大流

    BZOJ_3171_[Tjoi2013]循环格_最小费用最大流 Description 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为 ...

  7. [TJOI2013]循环格 费用流 BZOJ3171

    题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位(r,c),你可以沿着箭头方向在格子间行走.即:如果 ...

  8. 【bzoj3171】[Tjoi2013]循环格

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

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

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

随机推荐

  1. WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

    原文:WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定 WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件) 上面的 ...

  2. 腾讯云服务器centos7.2+nginx(开启gzip压缩)+uwsgi+Django+react

    因为项目原因,学习了react,Django,完成react开发项目过后,打包(做好了代码分割.压缩)放入Django中,在本地运行速度很快,结果放到服务器中,虽然某些js文件很小(只有一百多kb), ...

  3. 记一个bootstrap定制container导致页面X轴出现横向滚动条的坑

     壹 ❀ 引 在bootstrap定制时,因为UI给的图纸的页面主体部分宽度为1200px,所以我将container容器宽度从默认的1170px改成了1200px,随后在页面缩小的调试过程中发现了页 ...

  4. Python之基本运算符

    基本运算符 1.算符运算符 运算符 描述 例子 + 两个对象相加 a+b - 两个对象相减 a-b * 两个数相乘或返回一个被重复若干次的字符串 a*b / 两个数相除 a/b % 取模,返回除法的余 ...

  5. python登陆代码简单逻辑

    孩子:妈妈,我想要一个登陆的接口 妈妈:写,现在写,写1个够吗? 孩子:够了,妈妈真好,谢谢妈妈. 需求写一个简单的登陆逻辑: 1.定义一个账号和密码 2.输入账号和密码,密码要求密文 3.输入正确提 ...

  6. File 创建一个空目录,创建一个多级目录,删除一个目录

    package seday03; import java.io.File; /** * 创建一个空目录,* @author xingsir*/public class MkDirDemo { publ ...

  7. IDEA创建maven web工程

    一.新建一个maven web工程 step1 File --> New --> Project step2 按下图步骤操作 step3 填写项目信息 step4 选择本地的maven安装 ...

  8. python 计算 对象 占用大小

    # 这里主要是计算文件内容(str)的大小即: 统计空间占用情况, 并转换宜读单位 K,M def gen_atta_size(con): # 参数可以是任意数据类型 if con: size_b = ...

  9. 「杂谈」最有可能成为第五个一线城市,苏州 or 杭州?

    最有可能成为第五个一线城市,苏州 or 杭州? 一线城市的几个硬指标 所谓的"一线城市",并不是政府提倡或者说是官方发布的城市称号,是最近十几年因房地产行业的强势崛起,一些媒体尤其 ...

  10. [20190930]oracle raw类型转化number脚本.txt

    [20190930]oracle raw类型转化number脚本.txt --//写一个简单oracle raw转化number脚本,简单说明:--//输入必须是c1,02 或者 c102,不支持c1 ...