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把她最喜欢的一个二叉树模型挂在了墙上, ...
随机推荐
- 【193】◀▶ PowerShell 官方资料索引
Microsoft.PowerShell.Core 模块 Windows PowerShell 核心 Cmdlet Windows PowerShell 核心函数 Windows PowerShell ...
- adb devices 不识别显示为空(转载)
转自: http://yinger-fei.iteye.com/blog/1530118 在 android 设备的 Linux 内核中把 USB 驱动的 PID VID 修改以后,也许之前的 adb ...
- 【WIP】Objective-C Foundation框架的主要对象
创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类 可变与不变的对象 一览 种类 不变类 可变类 数组 NSA ...
- (二)python高级特性
一.切片 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python ...
- git介绍及安装
git介绍 git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目.git是linus Torvalds为了帮助管理Linux内核开发的一个开放源码的版本控制软件. Git 与常用 ...
- HTML/XML转义字符对照表
HTML/XML转义字符对照表 HTML/XML转义字符对照表包含符号.数学符号.希腊字母 .重要的国际标志.ISO 8859-1 (Latin-1)字符集.特殊符号等. 1.特殊字符转义表 字符 十 ...
- 数据流和ByteArray
问题:如何把一个long类型的数写进一个文件里 所以现在有DataInputStream和DataOutputStream 这两个是节点流 例子代码: import java.io.*; public ...
- [转]WF事件驱动
本文转自:http://www.cnblogs.com/Mayvar/archive/2011/09/03/wanghonghua_201109030446.html 已经有不少朋友知道Workflo ...
- ajax post 提交数据到服务端时中文乱码解决方法
get 方式提交数据到服务端不会乱码,但对数据量有限制;post 可以提交大数据量,但中文会发生乱码,解决方法: 在JS上用使用 encodeURIComponent 对字符编码处理: student ...
- hihocoder1710 等差子数列
思路: 将数列合并之后使用线段树.边界条件容易写错. 实现: #include <bits/stdc++.h> using namespace std; ; const int INF = ...