洛谷P4003 无限的围(infinityloop)(网络流,费用流)

洛谷题材传送门

各级一个人数的大学都是同样总理故事集,故事里有咱的悲喜、悲欢离合。

题目

高等学校之季年,有那一个地方,是公迈进大学接触的首先只家;有那几单人口,从展现第一当打便生出说话不结束的话语。TA们,游戏被贻笑大方而傻傻的操作,节日中整蛊你,让您心慌意乱。但为是TA们,在公难以过时,陪您吃饭、逛街与娓娓道来;在您姨妈到走访时,为汝打饭冲姜糖水;在你感冒时,帮你请假代你打药。

问题叙述

就发出一样缓流行的玩乐,叫做 Infinity Loop,先来简单的牵线一下此游乐:
娱乐在一个 n ∗ m
的网格状棋盘上进展,其中多少小方格中见面生出水管,水管可能在格子某些方向的边际的丁点起接口,所有水管之粗细都同,所以只要少单相邻方格的一道边界的中都产生理解,那么得看成这点儿个懂得互相连接。水管有坐下
15 种形状:

游戏开始时,棋盘中水管可能存在漏水的地方。
形式化地:如果在有接头,没有跟其余接头相连接,那么她便是一个渗出的地方。
玩家可展开相同种植操作:选定一个包含非直线型水管的方格,将其中的水管绕方格中心顺时针或逆时针旋转
90 度。
直线型水管是凭借左图里中路一行的点滴栽水管。
即被起一个始局面,请问最少进行小次操作可以要棋盘上未在漏水的地方。

你们一起享受着大学四年之喜怒哀乐,创造着许多幽默的回忆。时间越久,越会窥见那段时光的光明,以及下中TA们的宜人。大学四年,TA们见证了卿碰巧上前高校之马大哈与青涩,也见证了而运动来校门的熟以及睿智。

输入输出格式

高校舍友,或许是陪伴您无比悠久的食指。此时此刻,《高校在》专题、《都故事》专题、《故事》专题开始了齐征文活动,写来而同舍友的故事…

输入格式:

第一推行两单正整数 n, m,代表网格的大大小小。
通下去 n 行每行 m 个数,每个数是 [0,15] 中的一个,你可以用其当一个 4
位的第二进制数,从没有及大每一样各类分别表示初始局面中这个格子上、右、下、左方向上是否出水管接头。
特别地,如果此累是 0 ,则意味着是位置没有水管。
据 3(0011(2)) 代表及以及右起知,也便是一个 L 型;
设 12(1100(2)) 代表下及错误起知,也就算是将 L 型旋转 180 度。

01 征文主题

出口格式:

出口共一行,表示最少操作次数。如果无法上目标,输出-1.

足是室友关于学习、关于社团、关于未来之斗争,也足以是TA的要么凄美或欣慰之爱情故事,还好是您及TA之间的温小事儿……你眼中之TA,让您印象最好深厚的盛事小事,书写你与室友的故事,见证你们那些年的情分。

输入输出样例

是满足专题征文要求的,我们热心。里标题要统一成《这是自家之高校舍友|XXXXXX》,章可投稿至《高等学校在》专题、《都会故事》专题、《故事》和《立是自己之大学舍友》专题。

输入样例#1:

2 3
3 14 12
3 11 12

至于文章风格,可以记叙、可以抒情,也得文艺小清新。当然小四不过是举例,文风不限,只要会传达出您实在情感即可。

出口样例#1:

2

02 征文时间

输入样例#2:

3 2
1 8
5 10
2 4

2017年12月29日——2018年1月29日,获奖文章用于2018年1月30日左右盖专刊的形式以简书发文公布,并一起转发到相关专题微信群。

出口样例#2:

-1

03 征稿要求

输入样例#3:

3 3
9 11 3
13 15 7
12 14 6

(1)文末需附上本次征文活动链接,添加情也:

出口样例#3:

16

大学在&故事&城市故事并征文活动链接:https://www.jianshu.com/p/09ec5933f568

说明

(2)原创文章,字数得在1000配以上;段落分明,排版美观,文章规整,不得起个人推广账号和带来水印的图形等。

【样例 1 解释】

样例 1 棋盘如下
旋转方式很显眼,先将左上角虚线方格内之水管顺时针转 90 度

接下来右下比赛虚线方格内之水管逆时针旋转 90 度,这样即便让水管封闭了

04 征文福利

【样例 2 解释】

样例 2 乎问题叙述负的率先摆设图纸,无法上目标。

(1)凡入选专题征文者,将于《高校生活》专题、《市故事》专题、《故事》专题同时用,同时还起会引进到简书首页、简书日报及简书公众号。

【样例 3 解释】

样例 3
为题材叙述负之次摆图纸,将除核心方格以外的每个方格内的水管都转 180
度即可。

(2)专题一等奖、二等奖、三等奖和一些优秀奖的稿子用受收拾也运动专栏,并推举简书首页显示。同时考虑以优秀奖以上的稿子做成为电子书合集,联系简书出版公布。

思路分析

代表即是一律志思维神题。。。。。。
有人第一眼看上去觉得这要跑费用流吗?
可一旦会建图,剩下的哪怕是模拟模板的从事了。

咱如此来了解。对于每个方格上的水管之每一个支管,有且仅来一个别样方格上之支管与该相连,这样虽未见面漏水了。用网络流知识表述,就是每个支管容量只能为1,且均要满流,于是跑最小费用但行流

而即便有了极妙情况,整个管网也未肯定是一整个联通块,而或被分为多片。因此,怎样强制使各半单相邻之方格上还产生流量也?就假设将自汇点连到每个格子上。而且,还要对每个格点染色,相邻之蝇头独格点,一个连源点,一个连汇点。具体的兑现,就要采取格点队列坐标和之奇偶性来判断。

倘起的开支吧?当然是转造成的哪!真正的思量就是反映于此了。因为旋转还会见导致接触点的转,所以肯定是只要拆点的,一个方格拆成五独点,上下左右遭受。。。。。。中间点并上源/汇点,并基于支管情况于周围连容量1,费用0的度。四周视作接触点,与相应相邻之任何一个碰点并容量1,费用0的边。讨论相邻两只方格格因旋转而出的出费用的连边,实在是不过为难矣。。。。。。猛然察觉,所有的情,其实就待以内部进行中转就好了。

具有的方格,我们大体分为以下几像样进行讨论。

(3)获奖文章以见面吃转发到简书各个合法专题社群。

第一种:射线型

这种好惩治。射线对上面,那么即使叫左、下、右接触点一直连接达接触点。左,右连上去,表示若反90度过,所以费用为1。下面连上失去费用为2

05 奖项设置

第二种:直角型

这种理解起来就是生难度了。如果顺时针转90过,会成这样

相当给本并上接触点的支管连到了底,那么上及下修平漫漫容量为1,费用为1的界限。同样的理,逆时针转90过,左和右打平漫长容量为1,费用为1的尽头。再来谈谈反180度过,这时候,会透过就有些边由左、下直换到右手、上,费用加起来刚刚是2,所以无用连再次多边了。

评选出一等奖2叫,二等奖5称,三等奖8曰,优秀奖10称为。

第三种:T字型

诸如前一样讨论,也可建边。从下于左、右各打平长达容量为1,费用为1的边,向上建同等漫长费用为2的底限。这里就留给读者自己思考啦。


以上三种植情况,每一样栽都生4只样子,但连边方法都是同等的。
再有直线型,十字型和空的,要么不能够改,要么改变了没有意义,就甭内部建边了。

脚贴代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define R register int
#define UP(U) U+turn*sum
#define RI(U) U+((turn+1)&3)*sum
#define DO(U) U+((turn+2)&3)*sum
#define LE(U) U+((turn+3)&3)*sum
#define MD(U) U+(sum<<2)//上面几个用来计算对应点的数组下标,上下左右中。。。
const int INF=2147483647,N=20009,M=200009;
int sum,P=1,S=0,T;//sum方格总数,P建图循环变量,S、T为源汇点
int he[N],ne[M],to[M],f[M],c[M];//f流量,c费用
int q[N],d[N],pre[N];//q队列,d距离,pre记录最短路
bool inq[N];//标记是否在队列中
inline void in(R&z)//快读
{
    register char c=getchar();
    while(c<'-')c=getchar();
    z=c&15;c=getchar();
    while(c>'-')z*=10,z+=c&15,c=getchar();
}
inline void add(R u,R v,R flow,R cost,R tp)//建边,tp表示染色属性
{
    if(tp){tp=u;u=v;v=tp;}//如果是奇数点,所有的边都要反向,要流出去
    to[++P]=v;ne[P]=he[u];he[u]=P;c[P]=cost;f[P]=flow;
    to[++P]=u;ne[P]=he[v];he[v]=P;c[P]=-cost;
}
#define PB(X) q[t]=X;if(++t==N)t=0
#define PF(X) if(--h<0)h=N-1;q[h]=v//手打了一下双向循环队列
inline bool spfa()//模板,加了两种优化
{
    R h=0,t=1,i,u,v,dn,cnt=1,sum=0;
    for(i=S+1;i<=T;++i)d[i]=INF;
    q[0]=S;inq[0]=1;
    while(h!=t)
    {
        u=q[h];
        if(++h==N)h=0;
        if(d[u]*cnt>sum){PB(u);continue;}//LLL优化
        --cnt;sum-=d[u];
        for(i=he[u];i;i=ne[i])
            if(f[i]&&d[v=to[i]]>(dn=d[u]+c[i]))
            {
                if(inq[v])sum-=d[v];
                else
                {
                    inq[v]=1;++cnt;
                    if(d[v]<d[q[h]]){PB(v);}
                    else{PF(v);}//SLF优化
                }
                pre[v]=i;
                sum+=(d[v]=dn);
            }
        inq[u]=0;
    }
    return d[T]!=INF;
}
int main()
{
    R n,m,i,j,k=1,t,shape,turn,totf=0,mf=0,mc=0;//totf总流量,mf最大可行流,mc总费用
    in(n);in(m);
    sum=n*m;T=sum*5+1;
    for(i=0;i<n;++i)
        for(j=0;j<m;++j,++k)
        {
            turn=0;//turn下面会用来翻转,将同类型的水管归类到一起
            t=(i+j)&1;//t是染色属性,只要判断奇偶
            if(t)add(S,MD(k),INF,0,0);
            else add(MD(k),T,INF,0,0);
            if(i)add(DO(k-m),UP(k),1,0,t);
            if(j)add(RI(k-1),LE(k),1,0,t);
            in(shape);
            if(shape&1)add(UP(k),MD(k),1,0,t),++totf;//统计总流量
            if(shape&2)add(RI(k),MD(k),1,0,t),++totf;//因为每个流拆成了两段
            if(shape&4)add(DO(k),MD(k),1,0,t),++totf;//所以最终结果会是实际的两倍
            if(shape&8)add(LE(k),MD(k),1,0,t),++totf;//中点与四周点连边
            switch(shape)
            {
            case 8:++turn;//1000 ←
            case 4:++turn;//0100 ↓
            case 2:++turn;//0010 →
            case 1:       //0001 ↑
                add(RI(k),UP(k),1,1,t);
                add(DO(k),UP(k),1,2,t);
                add(LE(k),UP(k),1,1,t);
                break;//四种形状内部连边情况是一样的,转一下统一处理就方便些了,下面同理
            case 9:++turn; //1001 ┘
            case 12:++turn;//1100 ┐
            case 6:++turn; //0110 ┌
            case 3:        //0011 └
                add(DO(k),UP(k),1,1,t);
                add(LE(k),RI(k),1,1,t);
                break;
            case 13:++turn;//1101 ┤
            case 14:++turn;//1110 ┬
            case 7:++turn; //0111 ├
            case 11:       //1011 ┴
                add(DO(k),LE(k),1,1,t);
                add(DO(k),UP(k),1,2,t);
                add(DO(k),RI(k),1,1,t);
                break;
            }
        }
    while(spfa())
    {
        m=INF;//这里m记下流量
        for(i=T;i!=S;i=to[k^1])
        {
            k=pre[i];
            if(m>f[k])m=f[k];
        }
        mf+=m;
        for(i=T;i!=S;i=to[k^1])
        {
            k=pre[i];
            f[k]-=m;f[k^1]+=m;
            mc+=m*c[k];
        }
    }
    printf("%d",totf==mf<<1?mc:-1);//注意如果没能流满就输-1
    return 0;
}

一等奖:200老大现金打赏+简书包;(简书包具体如下图↓↓↓)

二等奖:100头版+一依照简书精致笔记本

三等奖:50元+一遵循简书精致笔记本

优秀奖:5~10冠中未齐,并从中选出10首优秀文章进入活动专栏。

06 评委席

简书官方:天地甜心

简书校园:小简简

故事:洛子帅
素智

都故事:soul麦芽 
邓大榆

大学在:沈小四 
南部来南风

07 征文活动补充说明

(1)本次征文活动由《高校生活》专题、《市故事》专题、《故事》专题联合主办征文获奖结果将出于各级专题主编和简书官方依据作品的基于文章质量(重要依据)、阅读量(仅供参考)、评论(仅供参考)、喜欢数(仅供参考)等指标综合评判。

(2)上述奖项不可再获得,现金统一打赏到简书钱包。

(3)本次征文解释权归三个专题有。

高等学校舍友,或许你刚好才说“你好”,或许你决定说“再见”,但还梦想您能够在此间,和我们大饱眼福您的高校,你跟舍友故事…

于此处,留下您眼中舍友的故事,让时光在这驻足。若干年后,青春不再,记忆永存。

若,准备好了啊?