LOJ 2321 清华集训2017 无限之环 拆点+最小费用最大流
题面:中文题面,这里不占用篇幅
分析:
看到题面,我就想弃疗……
但是作为任务题单,还是抄了题解……
大概就是将每个格子拆点,拆成五个点,上下左右的触点和一个负责连源汇点的点(以下简称本点)。
这个这个本点要根据初始形态向相应的触点连接费用为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 无限之环 拆点+最小费用最大流的更多相关文章
- BZOJ.5120.[清华集训2017]无限之环(费用流zkw 黑白染色)
题目链接 LOJ 洛谷 容易想到最小费用最大流分配度数. 因为水管形态固定,每个点还是要拆成4个点,分别当前格子表示向上右下左方向. 然后能比较容易地得到每种状态向其它状态转移的费用(比如原向上的可以 ...
- [清华集训2017]无限之环(infinityloop)
description 题面 solution 一开始的思路是插头\(DP\),然而复杂度太高 考虑将网格图黑白染色后跑费用流 流量为接口数,费用为操作次数 把一个方格拆成五个点,如何连边请自行脑补 ...
- UVA 1658 海军上将(拆点法+最小费用限制流)
海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...
- poj3422 拆点法x->x'建立两条边+最小费用最大流
/** 题目:poj3422 拆点法+最小费用最大流 链接:http://poj.org/problem?id=3422 题意:给定n*n的矩阵,含有元素值,初始sum=0.每次从最左上角开始出发,每 ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
- [LOJ#2330]「清华集训 2017」榕树之心
[LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
随机推荐
- Java多线程系列八——volatile和ThreadLocal
参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...
- wireshark笔记(1)之工具认识
1 下载链接 https://www.wireshark.org/ 安装只需要注意同时会安装winpcap就好了 相关链接:www.wiresharkbook.com //书籍 英文 www.wik ...
- 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} ...
- 洛谷 P2763 试题库问题【最大流】
s向所有类别属性连流量为当前类别属性需要的个数的边,所有题目向t连流量为1的边(表示只能选一次),所有属性向含有它的题连容量为1的边.跑一变dinic,结果小于m则无解,否则看每一个类别属性连出去的题 ...
- [App Store Connect帮助]七、在 App Store 上发行(3.4)提交至“App 审核”:将构建版本从审核中移除
若要停止“App 审核”流程,您可以将该 App 版本从 App 审核中移除.要执行此项操作,App 状态必须为下列之一: 正在等待出口合规检查 正在等待审核 正在审核 等待开发者发布 等待 Appl ...
- java 调用动态库打包sdk
java连接c++动态库并生成jar包提供给别人调用 1.需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承 在项目的src目录执行,否则会提示 错误:找不到符号 ja ...
- apache单ip多域名多目录配置
自己的vps上放了别人的网站,那怎么样让自己的网站和别人的网站能同时被访问呢?需要使用apache的虚拟主机配置. 配置httpd.conf文件 比如原来是这种只是指向一个目录的配置 Document ...
- linux系统添加java和glassfish环境变量
第一种方法: 可以在/etc/profile里面增加 #java环境变量 JAVA_HOME=/home/harries/develop/jdk1.6.0_23export JRE_HOME=/hom ...
- yum 安装报错:*epel: mirrors.aliyun.comError: xzcompressionnot available
环境背景:epel源下载地址: http://mirrors.aliyun.com/Centos内核内核版本[root@nfs01 ~]# uname -r2.6.32-642.el6.x86_64= ...
- java基础(六):RabbitMQ 入门
建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...