传送门

其实这题的建图并不难(虽然我并没有想出来)

首先,每一个点的入度和出度必须为$1$

那么我们考虑拆点

每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则费用$1$

然后源点向所有入度点连边,所有出度点向汇点连边

因为费用流首先是最大流,所以肯定能跑满

那么最小费用就是答案了

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #define inf 0x3f3f3f3f
 7 using namespace std;
 8 const int N=505,M=100005;
 9 int head[N],Next[M],ver[M],edge[M],cost[M],tot=1;
10 inline void add(int u,int v,int e,int c){
11     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e,cost[tot]=c;
12     ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=0,cost[tot]=-c;
13 }
14 int dis[N],vis[N],cur[N],S,T,ans;
15 queue<int> q;
16 bool spfa(){
17     memset(dis,-1,sizeof(dis));
18     memset(vis,0,sizeof(vis));
19     memcpy(cur,head,sizeof(int)*(T-S+1));
20     q.push(T),dis[T]=0,vis[T]=1;
21     while(!q.empty()){
22         int u=q.front();q.pop();vis[u]=0;
23         for(int i=head[u];i;i=Next[i])
24         if(edge[i^1]){
25             int v=ver[i],c=cost[i];
26             if(dis[v]<0||dis[v]>dis[u]-c){
27                 dis[v]=dis[u]-c;
28                 if(!vis[v]) vis[v]=1,q.push(v);
29             }
30         }
31     }
32     return ~dis[S];
33 }
34 int dfs(int u,int limit){
35     if(u==T||!limit) return limit;
36     int flow=0,f;vis[u]=1;
37     for(int i=cur[u];i;cur[u]=i=Next[i]){
38         int v=ver[i];
39         if(dis[v]==dis[u]-cost[i]&&!vis[v]&&(f=dfs(v,min(limit,edge[i])))){
40             flow+=f,limit-=f;
41             edge[i]-=f,edge[i^1]+=f;
42             ans+=f*cost[i];
43             if(!limit) break;
44         }
45     }
46     vis[u]=0;
47     return flow;
48 }
49 void zkw(){
50     while(spfa()) dfs(S,inf);
51 }
52 int id[N][N],c[N],n,m;char s[N];
53 int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
54 int main(){
55     //freopen("testdata.in","r",stdin);
56     c['L']=0,c['R']=1,c['U']=2,c['D']=3;
57     scanf("%d%d",&n,&m);
58     S=0,T=n*m*2+1;
59     for(int i=1;i<=n;++i)
60     for(int j=1;j<=m;++j)
61     id[i][j]=(i-1)*m+j;
62     for(int i=1;i<=n;++i){
63         scanf("%s",s+1);
64         for(int j=1;j<=m;++j)
65         for(int k=0;k<4;++k){
66             int x=(i+dx[k]-1+n)%n+1,y=(j+dy[k]-1+m)%m+1;
67             (k==c[s[j]])?add(id[i][j],id[x][y]+n*m,1,0):add(id[i][j],id[x][y]+n*m,1,1);
68         }
69     }
70     for(int i=1;i<=n*m;++i)
71     add(S,i,1,0),add(i+n*m,T,1,0);
72     zkw();
73     printf("%d\n",ans);
74     return 0;
75 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9581054.html

bzoj3171: [Tjoi2013]循环格(费用流)相关推荐

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

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

  2. [TJOI2013]循环格

    题目 我也不知道我建了个什么图,之后随便跑了跑就过了 发现要求形成一个环,改边的方向需要\(1\)的代价 根据网络流的套路开始拆点 每个点拆成两个点,\(S\)向入点连流量为\(1\)的边,出点向\( ...

  3. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  4. 一篇网络流 基本模型超全总结(最大流 费用流 多源汇最大流 上下界可行流) 思路+代码模板

    文章目录 一.网络流与最大流 二.网络流三个基本性质 三.重要定义定理 四.最大流算法 <Ⅰ> Edmonds-Karp算法(EK算法) 1.EK算法 2.算法思想: 3.代码模板 4.模 ...

  5. HDU 6445 2018CCPC网络赛1008 Search for Answer(费用流 + 构图)

    大致题意:给你一个竞赛图,告诉你一个记数方法,也即所有边同向的四元组加一,所有相邻两边方向相反的四元组减一.现在让你最大化这个结果. 说实话,不看题解应该很难想到是一个费用流--题解给的也真是简单,个 ...

  6. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  7. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  8. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  9. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

最新文章

  1. SKU表管理之查询获取sku表列表数据
  2. 神经网络如何「动」起来?| 「动态神经网络」的六大待解难题
  3. CSS3 Animation(下)
  4. 【 C 】assert.h 简明介绍
  5. java时间格式转换_Java中System.currentTimeMillis()计算方式与时间的单位转换
  6. BootStrap_01之全局样式
  7. 基于模糊控制的自平衡小车的研究
  8. mybatis-批量操作
  9. C# CSV文件读取(带换行单元格中内容处理)
  10. 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)
  11. python数量推荐_太香了,墙裂推荐3个Python数据分析EDA神器!
  12. Django 学习笔记之一 环境搭建
  13. 计算机ppt板块正文文本动画在哪,《计算机应用基础》统考辅导第章PowerPoint电子演示文稿.ppt...
  14. 《高性能MySQL-第三版》 的总评价
  15. 调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加
  16. redis指定配置文件启动不生效_redis配置文件不生效
  17. comsol操作技巧
  18. calcbusiness使用教程_Calc Business
  19. 36岁的it一线运维是不是废了_35以上IT人咋活?给你三个真实的案例
  20. 记笔记非常好用的一款工具 eDiary

热门文章

  1. C语言获得数组长度的函数
  2. 基于JSP/SERVLET的省心物流管理
  3. Windows上同时安装两个数据库
  4. LIME:一种解释机器学习模型的方法
  5. 迁移学习——入门笔记
  6. Html与Css关联到一起
  7. 修改Spring boot内置的tomcat端口
  8. 暴雪战斗公式——除法公式的精髓
  9. [转]struts2处理.do后缀的请求
  10. 最简单也最难——怎样获取到Android控件的高度