[清华集训2017]无限之环(网络流)

很妙的一道题

对于每个格子,它合法与否,只跟它上下左右的相邻格子有关,所以可以想到黑白染色
(用 (i,j) 表示 i 行 j 列的格子,我把 (i+j) %2 == 0 的格子染成白色,把(i+j)%2 == 1 的格子染成黑色)

关键是怎么描述旋转操作

我朴实的想法是给每个格子建四个点,每个点代表格子可通过旋转达到的一种状态,从格子的初始状态向格子其它状态连边,然后把格子间可以匹配的状态连起来,再然后……就没有然后了

看了题解,真的被惊到了
还是把每个格子拆成4个节点,对应四个方向上的接口
从源点向白格的接口连流量上界1,费用0的边
从黑格的接口向汇点连流量上界1,费用0的边
从黑格的接口向可以匹配的白格的接口连流量上界1,费用0的边
然后旋转操作,就可以通过一种神奇方式描述出来:

	AD	O	BC

把这个看成一个白格(黑格类似,只是连边方向相反)
边(u->v,f,w)代表从 u 到 v,流量上界 f,费用 w 的边
下文描述的旋转方向均为顺时针
1.此格有1个接口:

	A|
D	O	BC

(A->B ,1,1)) 对应转90度
(A->C, 1,2)) 对应转180度
(A->D ,1,1)) 对应转270度
2.此格有2个接口:
情况1:

	 A|
D	 O —— BC

(A->C, 1,1)) 对应转90度
(B->D ,1,1)) 对应转270度
(A->C, 1,1))+(B->D ,1,1)) 对应转180度
情况2:

	A|
D	O	B|C

不能转,忽略
3.此格有3个接口:

	 A|
D 	 O —— B|C

(A->D ,1,1)) 对应转270度
(B->D, 1,2)) 对应转180度
(C->D ,1,1)) 对应转90度
4.此格有4个接口:

	 A|
D —— O —— B|C

转了也没区别,忽略

建完图后跑最小费用最大流即可

如果我表达不清的话,这是样例1的建图,很丑,凑合着看吧
在这里插入图片描述
图上标的数代表费用,没标的边默认费用为0,所有边的流量上界默认为1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf=0x7fffffff;
const int N=8100;
const int M=200010;
struct Edge{int u,v,f,w,nxt;
}edge[M<<1];
int s,t,head[N],cnt,maxflow,mincost,dis[N],inque[N],pre[N];
queue<int> q;
int n,m,id[2005][2005][4],num,gr[2005][2005],tot;
void add(int u,int v,int f,int w){edge[cnt].u=u;edge[cnt].v=v;edge[cnt].f=f;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt++;edge[cnt].u=v;edge[cnt].v=u;edge[cnt].f=0;edge[cnt].w=-w;edge[cnt].nxt=head[v];head[v]=cnt++;
}
bool spfa(){memset(dis,0x7f,sizeof(dis));memset(inque,0,sizeof(inque));memset(pre,-1,sizeof(pre));dis[s]=0;q.push(s);inque[s]=1;while(!q.empty()){int u=q.front();q.pop();inque[u]=0;for(int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].v;if(edge[i].f>0&&dis[v]>dis[u]+edge[i].w){dis[v]=dis[u]+edge[i].w;pre[v]=i;if(!inque[v]){q.push(v);inque[v]=1;}}}} if(pre[t]!=-1) return 1;return 0;
}
void EK(){int flow;while(spfa()){flow=inf;int x=pre[t];while(x!=-1){flow=min(edge[x].f,flow);x=pre[edge[x].u];}x=pre[t];while(x!=-1){edge[x].f-=flow;edge[x^1].f+=flow;mincost+=flow*edge[x].w;x=pre[edge[x].u];}maxflow+=flow;}
}
int main(){memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=0;k<4;k++)id[i][j][k]=++num;s=++num,t=++num;		for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&gr[i][j]);int tt=0,pos[5]={-1,-1,-1,-1,-1},npos=-1;for(int k=0;k<4;k++){if(gr[i][j]&(1<<k)){tot++;pos[++tt]=k;if((i+j)%2==0) add(s,id[i][j][k],1,0);else add(id[i][j][k],t,1,0);}else npos=k;}if(tt==1){if((i+j)%2==0){add(id[i][j][pos[1]],id[i][j][(pos[1]+1)%4],1,1);add(id[i][j][pos[1]],id[i][j][(pos[1]+2)%4],1,2);add(id[i][j][pos[1]],id[i][j][(pos[1]+3)%4],1,1);}else{add(id[i][j][(pos[1]+1)%4],id[i][j][pos[1]],1,1);add(id[i][j][(pos[1]+2)%4],id[i][j][pos[1]],1,2);add(id[i][j][(pos[1]+3)%4],id[i][j][pos[1]],1,1);}}else if(tt==2){if(pos[2]-pos[1]==2) continue;if((i+j)%2==0){add(id[i][j][pos[1]],id[i][j][(pos[1]+2)%4],1,1);add(id[i][j][pos[2]],id[i][j][(pos[2]+2)%4],1,1);}else{add(id[i][j][(pos[1]+2)%4],id[i][j][pos[1]],1,1);add(id[i][j][(pos[2]+2)%4],id[i][j][pos[2]],1,1);}}else if(tt==3){if((i+j)%2==0){add(id[i][j][(npos+1)%4],id[i][j][npos],1,1);add(id[i][j][(npos+2)%4],id[i][j][npos],1,2);add(id[i][j][(npos+3)%4],id[i][j][npos],1,1);}else{add(id[i][j][npos],id[i][j][(npos+1)%4],1,1);add(id[i][j][npos],id[i][j][(npos+2)%4],1,2);add(id[i][j][npos],id[i][j][(npos+3)%4],1,1);}}else continue;}}//一开始这一块的建图错了 int dx[]={-1,0,1,0};int dy[]={0,1,0,-1};for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if((i+j)%2==0){for(int k=0;k<=3;k++){int x=i+dx[k],y=j+dy[k];if(x<1||x>n||y<1||y>m) continue;add(id[i][j][k],id[x][y][(k+2)%4],1,0);}}}}EK();if(tot%2!=0||maxflow!=tot/2) printf("-1\n"); //注意还要判断tot%2!=0的情况 else printf("%d\n",mincost);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ST表】【单调队列】Window(jzoj 1326)

Window jzoj 1326 题目大意 给你一个序列a和一个数k&#xff0c;让你求a中所有长为k的子序列的最大值和最小值 输入样例 8 3 1 3 -1 -3 5 3 6 7输出样例 -1 -3 -3 -3 3 3 3 3 5 5 6 7数据范围 2020%&#xff1a; n\leqslant 500; 50%: n\leqslant 100000;20 100100%: n\l…

牛客网 【每日一题】4月23日题目精讲 边的染色

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小团有一张n个点&#xff0c;m条边的无向图G&#xff0c;有些边上已经被标记了0或1&#xff0c;表示它的边权…

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具&#xff08;GitHub&#xff09;&#xff0c;也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的&#xff0c;也就是说实体类和SQL语句都要自己写&#xff0c;但它提供自动对象映射。是通过对IDbConnection接口…

P1446-[HNOI2008]Cards【Burnside引理,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1446 题目大意 三个颜色的一些东西排在一起&#xff0c;给mmm种置换&#xff0c;求本质不同的染色方案数。 解题思路 BurnsideBurnsideBurnside引理&#xff1a;置换集合GGG时本质不同的序列方案等于∑x∈Gc(x)∣G∣\frac{\…

传送门(最短路树+可并堆)

Description 有一张n个点m条边的无向图&#xff0c;求删去任意一条边后&#xff0c;从S到T的最短距离的最大值 n, m ≤ 21052 \times 10^52105 Solution 这道题是[USACO09JAN]Safe Travel的变形&#xff0c;然后这是题解 Safe Travel这道题的普遍做法是并查集或树剖&#…

【DP】Mobile Service(jzoj 1327)

Mobile Service jzoj 1327 题目大意 某公司有三个员工&#xff0c;现在有n个时刻&#xff0c;某一时刻要一个员工到一个位置&#xff08;别的员工不能动&#xff09;&#xff0c;代价为ci,jc_{i,j}ci,j​&#xff0c;一个位置一个时刻最多有一个人&#xff0c;问最小代价是多…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

病毒扩散

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200429210705568.png?x-oss-processimage/waterm…

P3200-[HNOI2009]有趣的数列【卡特兰数】

正题 题目链接:https://www.luogu.com.cn/problem/P3200 题目大意 求一个长度为2∗n2*n2∗n的排列要求 奇数位和偶数位分别递增相邻的偶数位大于奇数位 解题思路 可以看做是一个2∗n2*n2∗n的序列按顺序填进奇数和偶数位&#xff0c;然后因为第二个要求所以奇数位在任何时候…

【SPFA】Party(jzoj 1328)

Party jzoj 1328 题目大意 有一个有向图&#xff0c;给你一个x&#xff0c;让你求每一个点到x再回去的最短路径&#xff0c;输出所有最短路径的最大值 输入样例 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3输出样例 10 样例解释 数据范围 1⩽x⩽N⩽10001\le…

【每日一题】4月27日题目精讲 Removal

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 Bobo has a sequence of integers s1, s2, …, sn where 1 ≤ si ≤ k. Find out the number of distinc…

[CF966E] May Holidays(树上数据结构问题、分块+虚树)

Description 一个 n 个结点的有根树&#xff0c;每个结点 x 有一个值 txt_xtx​&#xff0c;和一个颜色 (黑/白)。 m 次操作&#xff1a; 翻转某点颜色。询问有多少点 x 满足&#xff1a;x 为黑色&#xff0c;x 的白色后代数 > tx。 n, m ≤ 10510^5105 Solution 令 wi …

Asp.Net Core 2.2.0-preview1已经发布

原文地址 ASP.NET Core 2.2.0-preview1 now available今天我们很高兴地宣布,现在可以试用ASP.NET Core和.NET Core的下一个次要版本的第一个预览。在过去的几个月里&#xff0c;我们和社区里的许多人一起为这个版本进行开发&#xff0c;现在它已经准备好让更广泛的受众尝试它并…

YbtOJ#20089-[NOIP2020模拟赛B组Day10]平衡的树【贪心】

正题 题目链接:https://www.ybtoj.com.cn/contest/70/problem/3 题目大意 一棵树nnn个节点&#xff0c;每条边(x,y,a,b)(x,y,a,b)(x,y,a,b)&#xff0c;可以花费111的代价让一条边的a,ba,ba,b都减去111&#xff0c;但是不能小于000&#xff0c;要求最少代价使得每条边满足yyy…

纪中B组模拟赛总结(2020.2.13)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4141414lyflyflyf200200200100100100000000100100100 总结 今天真改“滚”QAQ T1一开始不会&#xff0c;最后才来做&#xff0c;发现了题目的精髓&#xff0c;才切掉 T2打了个ST表&#xff0c;MLE&#x…

牛客网【每日一题】4月28日题目精讲 美味菜肴

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小明是个大厨&#xff0c;早上起来他开始一天的工作。他所在的餐厅每天早上都会买好n件食材&#xff08;每种…

UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)

Description 一棵 n 个点的有根树&#xff0c;带点权 wi。 从 s 出发&#xff0c;希望达到 t&#xff0c;每秒可以从当前点移动到某一个儿子。 有一个死亡次数&#xff0c;初始为 0。若在某个点 i(i ! s, t) 时&#xff0c;死亡次数 ≤ wi&#xff0c;那么死亡次数自增 1&…

C#系列之聊聊.Net Core的InMemoryCache

这两天在看.net core的in memory cache&#xff0c;这里记录一下用法&#xff0c;主要涉及MemoryCache的Get&#xff0f;Set&#xff0f;Expire&#xff0f;Flush。首先我们先用dotnet命令创建一个mvc的项目&#xff0c;这里我们将使用postman来请求server&#xff0c;1dotnet …

P1412-经营与开发【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1412 题目大意 nnn个地点&#xff0c;有一个能力值为www的稿子 如果地点iii是资源型的&#xff0c;那么可以选择获得ai∗wa_i*wai​∗w的价值&#xff0c;且ww∗(1−k100)ww*(1-\frac{k}{100})ww∗(1−100k​)如果地点iii是…

纪中在家培训总结(2020.2.1~2020.2.24)

前言 因为新型冠状病毒&#xff08;疫情情况&#xff09;的原因&#xff0c;纪中培训改为在家培训&#xff0c;一天的进度变成了两天甚至三天的进度QAQ&#xff0c;但我还是想说&#xff1a;武汉加油&#xff01;中国加油&#xff01; 这次培训总结没啥好写&#xff0c;请勿嘲…