题面:中文题面,这里不占用篇幅

分析:

  看到题面,我就想弃疗……

  但是作为任务题单,还是抄了题解……

  大概就是将每个格子拆点,拆成五个点,上下左右的触点和一个负责连源汇点的点(以下简称本点)。

  这个这个本点要根据初始形态向相应的触点连接费用为0容量为1的边,再由旋转规则,使初始触点向相应的触点连接费用为旋转次数的边,然后相邻的格子触点相连?

  反正很乱就是了。如果再写一遍,我应该不会写罢……

代码:(这份代码在Luogu上不开O2会TLE十八组数据……开了才能过,在loj是可过的)

  1. #include<bits/stdc++.h>
  2. #define up(u) u+tn*sm
  3. #define ri(u) u+((tn+1)&3)*sm
  4. #define dn(u) u+((tn+2)&3)*sm
  5. #define le(u) u+((tn+3)&3)*sm
  6. #define md(u) u+(sm<<2)
  7. using namespace std;queue<int>q;
  8. const int N=,M=,inf=0x3f3f3f3f;
  9. struct node{int y,z,f,nxt;}e[M];
  10. int mf=,f[N],lst[N],ans=;bool vis[N];
  11. int sm,c=,S=,T,h[N],d[N],pre[N],n,m,k;
  12. void add(int x,int y,int f,int z,int tp){
  13. if(tp) swap(x,y);
  14. e[++c]=(node){y,z,f,h[x]};h[x]=c;
  15. e[++c]=(node){x,-z,,h[y]};h[y]=c;
  16. } bool spfa(){
  17. for(int i=S;i<=T;i++) pre[i]=-,
  18. f[i]=inf,lst[i]=vis[i]=,d[i]=inf;
  19. q.push(S);d[S]=;pre[S]=;
  20. while(q.size()){
  21. int x=q.front();q.pop();vis[x]=;
  22. for(int i=h[x],y;i;i=e[i].nxt)
  23. if(d[y=e[i].y]>d[x]+e[i].z&&e[i].f){
  24. d[y]=d[x]+e[i].z;pre[y]=x;lst[y]=i;
  25. f[y]=min(f[x],e[i].f);
  26. if(!vis[y]) vis[y]=,q.push(y);
  27. }
  28. } return (pre[T]!=-);
  29. } void solve(){
  30. while(spfa()){
  31. ans+=d[T]*f[T];int x=T;mf+=f[T];
  32. while(x) e[lst[x]].f-=f[T],
  33. e[lst[x]^].f+=f[T],x=pre[x];
  34. } return ;
  35. } int main(){
  36. k=;int t,sp,tn,tf=,mc=;
  37. scanf("%d%d",&n,&m);sm=n*m;T=sm*+;
  38. for(int i=;i<n;i++)
  39. for(int j=;j<m;j++,k++){
  40. tn=;t=(i+j)&;
  41. if(t) add(S,md(k),inf,,);
  42. else add(md(k),T,inf,,);
  43. if(i) add(dn(k-m),up(k),,,t);
  44. if(j) add(ri(k-),le(k),,,t);
  45. scanf("%d",&sp);
  46. if(sp&) add(up(k),md(k),,,t),tf++;
  47. if(sp&) add(ri(k),md(k),,,t),tf++;
  48. if(sp&) add(dn(k),md(k),,,t),tf++;
  49. if(sp&) add(le(k),md(k),,,t),tf++;
  50. switch(sp){
  51. case :tn++;
  52. case :tn++;
  53. case :tn++;
  54. case :
  55. add(ri(k),up(k),,,t);
  56. add(dn(k),up(k),,,t);
  57. add(le(k),up(k),,,t);break;
  58. case :tn++;
  59. case :tn++;
  60. case :tn++;
  61. case :
  62. add(dn(k),up(k),,,t);
  63. add(le(k),ri(k),,,t);break;
  64. case :tn++;
  65. case :tn++;
  66. case :tn++;
  67. case :
  68. add(dn(k),le(k),,,t);
  69. add(dn(k),up(k),,,t);
  70. add(dn(k),ri(k),,,t);break;
  71. }
  72. } solve();
  73. printf("%d",tf==mf<<?ans:-);return ;
  74. }

费用流

  

LOJ 2321 清华集训2017 无限之环 拆点+最小费用最大流的更多相关文章

  1. BZOJ.5120.[清华集训2017]无限之环(费用流zkw 黑白染色)

    题目链接 LOJ 洛谷 容易想到最小费用最大流分配度数. 因为水管形态固定,每个点还是要拆成4个点,分别当前格子表示向上右下左方向. 然后能比较容易地得到每种状态向其它状态转移的费用(比如原向上的可以 ...

  2. [清华集训2017]无限之环(infinityloop)

    description 题面 solution 一开始的思路是插头\(DP\),然而复杂度太高 考虑将网格图黑白染色后跑费用流 流量为接口数,费用为操作次数 把一个方格拆成五个点,如何连边请自行脑补 ...

  3. UVA 1658 海军上将(拆点法+最小费用限制流)

    海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...

  4. poj3422 拆点法x->x'建立两条边+最小费用最大流

    /** 题目:poj3422 拆点法+最小费用最大流 链接:http://poj.org/problem?id=3422 题意:给定n*n的矩阵,含有元素值,初始sum=0.每次从最左上角开始出发,每 ...

  5. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  6. [LOJ#2330]「清华集训 2017」榕树之心

    [LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...

  7. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  8. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  9. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

随机推荐

  1. Java多线程系列八——volatile和ThreadLocal

    参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...

  2. wireshark笔记(1)之工具认识

    1 下载链接  https://www.wireshark.org/ 安装只需要注意同时会安装winpcap就好了 相关链接:www.wiresharkbook.com //书籍 英文 www.wik ...

  3. bzoj 2194: 快速傅立叶之二【NTT】

    看别的blog好像我用了比较麻烦的方法-- (以下的n都--过 \[ c[i]=\sum_{j=i}^{n}a[i]*b[j-i] \] 设j=i+j \[ c[i]=\sum_{j=0}^{n-i} ...

  4. 洛谷 P2763 试题库问题【最大流】

    s向所有类别属性连流量为当前类别属性需要的个数的边,所有题目向t连流量为1的边(表示只能选一次),所有属性向含有它的题连容量为1的边.跑一变dinic,结果小于m则无解,否则看每一个类别属性连出去的题 ...

  5. [App Store Connect帮助]七、在 App Store 上发行(3.4)提交至“App 审核”:将构建版本从审核中移除

    若要停止“App 审核”流程,您可以将该 App 版本从 App 审核中移除.要执行此项操作,App 状态必须为下列之一: 正在等待出口合规检查 正在等待审核 正在审核 等待开发者发布 等待 Appl ...

  6. java 调用动态库打包sdk

    java连接c++动态库并生成jar包提供给别人调用 1.需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承 在项目的src目录执行,否则会提示 错误:找不到符号 ja ...

  7. apache单ip多域名多目录配置

    自己的vps上放了别人的网站,那怎么样让自己的网站和别人的网站能同时被访问呢?需要使用apache的虚拟主机配置. 配置httpd.conf文件 比如原来是这种只是指向一个目录的配置 Document ...

  8. linux系统添加java和glassfish环境变量

    第一种方法: 可以在/etc/profile里面增加 #java环境变量 JAVA_HOME=/home/harries/develop/jdk1.6.0_23export JRE_HOME=/hom ...

  9. yum 安装报错:*epel: mirrors.aliyun.comError: xzcompressionnot available

    环境背景:epel源下载地址: http://mirrors.aliyun.com/Centos内核内核版本[root@nfs01 ~]# uname -r2.6.32-642.el6.x86_64= ...

  10. java基础(六):RabbitMQ 入门

    建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...