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

分析:

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

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

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

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

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

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

 #include<bits/stdc++.h>
#define up(u) u+tn*sm
#define ri(u) u+((tn+1)&3)*sm
#define dn(u) u+((tn+2)&3)*sm
#define le(u) u+((tn+3)&3)*sm
#define md(u) u+(sm<<2)
using namespace std;queue<int>q;
const int N=,M=,inf=0x3f3f3f3f;
struct node{int y,z,f,nxt;}e[M];
int mf=,f[N],lst[N],ans=;bool vis[N];
int sm,c=,S=,T,h[N],d[N],pre[N],n,m,k;
void add(int x,int y,int f,int z,int tp){
if(tp) swap(x,y);
e[++c]=(node){y,z,f,h[x]};h[x]=c;
e[++c]=(node){x,-z,,h[y]};h[y]=c;
} bool spfa(){
for(int i=S;i<=T;i++) pre[i]=-,
f[i]=inf,lst[i]=vis[i]=,d[i]=inf;
q.push(S);d[S]=;pre[S]=;
while(q.size()){
int x=q.front();q.pop();vis[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]>d[x]+e[i].z&&e[i].f){
d[y]=d[x]+e[i].z;pre[y]=x;lst[y]=i;
f[y]=min(f[x],e[i].f);
if(!vis[y]) vis[y]=,q.push(y);
}
} return (pre[T]!=-);
} void solve(){
while(spfa()){
ans+=d[T]*f[T];int x=T;mf+=f[T];
while(x) e[lst[x]].f-=f[T],
e[lst[x]^].f+=f[T],x=pre[x];
} return ;
} int main(){
k=;int t,sp,tn,tf=,mc=;
scanf("%d%d",&n,&m);sm=n*m;T=sm*+;
for(int i=;i<n;i++)
for(int j=;j<m;j++,k++){
tn=;t=(i+j)&;
if(t) add(S,md(k),inf,,);
else add(md(k),T,inf,,);
if(i) add(dn(k-m),up(k),,,t);
if(j) add(ri(k-),le(k),,,t);
scanf("%d",&sp);
if(sp&) add(up(k),md(k),,,t),tf++;
if(sp&) add(ri(k),md(k),,,t),tf++;
if(sp&) add(dn(k),md(k),,,t),tf++;
if(sp&) add(le(k),md(k),,,t),tf++;
switch(sp){
case :tn++;
case :tn++;
case :tn++;
case :
add(ri(k),up(k),,,t);
add(dn(k),up(k),,,t);
add(le(k),up(k),,,t);break;
case :tn++;
case :tn++;
case :tn++;
case :
add(dn(k),up(k),,,t);
add(le(k),ri(k),,,t);break;
case :tn++;
case :tn++;
case :tn++;
case :
add(dn(k),le(k),,,t);
add(dn(k),up(k),,,t);
add(dn(k),ri(k),,,t);break;
}
} solve();
printf("%d",tf==mf<<?ans:-);return ;
}

费用流

  

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如何遍历map的所有的元素(各种方法)

    JDK1.4中 Map map = new HashMap(); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map ...

  2. SVN常用命令说明(转载)

    转自:http://www.blogjava.net/jasmine214--love/archive/2011/01/12/342839.html /** * 转载请注明作者longdick htt ...

  3. J20170521-ts

    組み込み 内置 リダイレクト 重定向 ディスクリプタ 描述符 バッファリング n 缓冲  

  4. CMake学习笔记二:cmake 常用变量和常用环境变量

    1 cmake 变量引用的方式 使用 ${} 进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过 ${} 取值. 2 cmake 自定义变量的方式 主要有隐式定义和显式定义两种,举一个隐式定 ...

  5. C/C++带有空格的字符串输入

    一.带有空格的字符串输入 (一)C++篇 1. 针对字符数组而言 方法一 getline() 读入整行数据,使用回车键输入换行符来确定输入结尾. 调用方法: cin.getline(str,len) ...

  6. 2018年全国多校算法寒假训练营练习比赛(第五场):A题:逆序数(树状数组or归并排序)

    题目描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.比如一个序列为4 5 1 3 2, 那么这个序列 ...

  7. [转]无废话SharePoint入门教程二[SharePoint发展、工具及术语]

    本文转自:http://www.cnblogs.com/iamlilinfeng/p/3186919.html 一.前言 1.由于上一篇文章的标题命名失误,此篇标题写给百度搜索”什么是SharePoi ...

  8. 窗体WINFORM

    窗体的事件:删除事件:先将事件页面里面的挂好的事件删除,再删后台代码里面的事件 Panel是一个容器 1.Label -- 文本显示工具Text:显示的文字取值.赋值:lable1.Text 2.Te ...

  9. 【Mybatis】环境搭建

    SqlMapConfig.xml(MyBatis配置文件) <?xml version="1.0" encoding="UTF-8" ?> < ...

  10. MySQL DECIMAL数据类型

    https://blog.csdn.net/zyz511919766/article/details/49335565