题目链接

戳我

\(Description\)

给你一个\(n*m\)的网格,以及网格上的两个格子\(A,B\).每个格子有一个高度.每次操作可以选择一个格子(不能是\(A\)或\(B\))并将它的高度增加\(1\).你希望在\(A,B\)间不存在任何一条不上升路径.求最少操作次数。

\(Solution\)

这道题很容易看出来是最小割啊.

我们想一想怎么建图.

最容易想到的是两两之间连边,跑最小割,但是这个很明显是不对的.因为一个点增加了一定的值,可能对别的链有影响,所以不能怎么建图.

再来想一想,假设我们现在有一个点\((x,y)\),四个相邻的点大于等于他.

我们将这四个点的值从小到大排一遍序

对于\(1-3\)的点,我们将他们从小编号向他自己的编号\(+1\)的点连一条流量为这个点的\(w-w[x][y]\),

对于\(4\)这个点,我们将他连向\((x,y)\)这个点,流量也为这个点的\(w-w[x][y]\).

最后在将这四个点分别向自己在这四个新建节点中对应点连一条流量为\(inf\)的边

注意要特判一下终点和起点,因为这两个点不可以增加高度

\(Code\)

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
struct node{
int to,next,v;
}a[200001];
int head[100001],cnt,n,m,s,t,x,y,z,dep[100001],fx,fy,X,Y;
void add(int x,int y,int c){
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].v=c,head[x]=cnt;
a[++cnt].to=x,a[cnt].next=head[y],a[cnt].v=0,head[y]=cnt;
}
queue<int> q;
int bfs(){
memset(dep,0,sizeof(dep));
q.push(s);
dep[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
if(!dep[v]&&a[i].v>0)
dep[v]=dep[now]+1,q.push(v);
}
}
if(dep[t])
return 1;
return 0;
}
int dfs(int k,int list){
if(k==t||!list)
return list;
for(int i=head[k];i;i=a[i].next){
int v=a[i].to;
if(dep[v]==dep[k]+1&&a[i].v>0){
int p=dfs(v,min(list,a[i].v));
if(p){
a[i].v-=p;
if(i&1) a[i+1].v+=p;
else a[i-1].v+=p;
return p;
}
}
}
return dep[k]=0;
}
int Dinic(){
int ans=0,k;
while(bfs())
while((k=dfs(s,inf)))
ans+=k;
if(ans>=inf) return -1;
return ans;
}
int id[101][101],val[101][101],tot;
int dx[6]={0,0,0,-1,1};
int dy[6]={0,1,-1,0,0};
struct node1 {
int x,y,v;
}b[10];
bool cmp(const node1 & a , const node1 & b){
return a.v<b.v;
}
int main(){
int T=read();
while(T--){
n=read(),m=read(),s=0,t=n*m*5+1,tot=0,cnt=0;
memset(head,0,sizeof(head));
X=read(),Y=read(),fx=read(),fy=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
id[i][j]=++tot,val[i][j]=read();
add(s,id[X][Y],inf),add(id[fx][fy],t,inf);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int res=0;
for(int k=1;k<=4;k++){
int x=i+dx[k],y=j+dy[k];
if(x<1||y<1||x>n||y>m) continue;
if(val[i][j]<=val[x][y])
b[++res].x=x,b[res].y=y,b[res].v=val[x][y];
if((i==X&&j==Y)||(i==fx&&j==fy)){
if(val[i][j]>val[x][y]) add(id[x][y],id[i][j],0);
else add(id[x][y],id[i][j],inf);
}
}
if((i==X&&j==Y)||(i==fx&&j==fy)||res==0)
continue;
sort(b+1,b+1+res,cmp);
for(int k=1;k<res;k++){
int x=b[k].x,y=b[k].y,v=b[k].v;
tot++,add(tot,tot+1,v-val[i][j]+1),add(id[x][y],tot,inf);
}
tot++,add(id[b[res].x][b[res].y],tot,inf),add(tot,id[i][j],b[res].v-val[i][j]+1);
}
printf("%d\n",Dinic());
}
return 0;
}

「CodeChef - SKIRES」Ski Resort的更多相关文章

  1. Solution -「CodeChef JUMP」Jump Mission

    \(\mathcal{Description}\)   Link.   有 \(n\) 个编号 \(1\sim n\) 的格子排成一排,并有三个权值序列 \(\{a_n\},\{h_n\},\{p_n ...

  2. 「Codechef April Lunchtime 2015」Palindromeness

    「Codechef April Lunchtime 2015」Palindromeness 解题思路 : 考虑对于回文子串 \(s\) 贡献的定义: \[ value_s = [\ s[1,\lflo ...

  3. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  4. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  5. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  6. 更新日志 - fir.im「高级统计」功能上线

    距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...

  7. Notepad++ 开启「切分窗口」同时检视、比对两份文件

    Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...

  8. 「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization

    最近在实验室做一些 Zigbee 相关的事情,然而一直没在博客上记录啥东西,也不像原来在公司有动力在 Confluence wiki 上扯东扯西.直到前些阵子,跑到 feibit 论坛上(国内较大的一 ...

  9. 「C语言」文件的概念与简单数据流的读写函数

    写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...

随机推荐

  1. CentOS7入门到精通实战课程课后习题

    Linux自动化运维系列①: CentOS7入门到精通实战--->传送门 http://edu.51cto.com/course/13055.html 01.系统入门课后习题 1.口述一个命令执 ...

  2. ES6系列_14之promise对象的简单使用

    1.产生原因 在前端开发中,最常见的的就是"回调",我相信很多人对于这个"回调"可谓是印象深刻呢.究其原因是因为层层回调会造成所谓的“回调地狱 (callbac ...

  3. Mock.js开发中拦截Ajax

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 在我们的生产实际中,后端的接口往往是 ...

  4. 可视化库-Matplotlib-直方图(第四天)

    1.plt.hist(array, bins, color)  # array表示数值, bins表示的是bin的范围 data = np.random.normal(0, 20, 1000) # 画 ...

  5. LInux Centos7 重装yum

    Linux yum默认安装python2.7,犹豫2020年之后不更新, 安装python3.6,出现了yum运行失败, 因为yum是依赖python的 1:先删除原有YUM rpm -aq|grep ...

  6. C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结: 1.枚举类型 //遍历枚举类型Sample的各个枚举名称 foreach (string sp in Enum.GetNames(typeof(Sample))) ...

  7. win7局域网内共享文件夹及安全设置

    右键想要共享的文件夹,选择属性. 在文件夹属性对话框中选择共享标签,如图: 点击共享按钮,弹出文件共享对话框. 添加 Everyone ,并根据实际需要修改权限.权限可以是读取 或 读取/写入. 到此 ...

  8. Emacs及扩展配置

    Emacs及扩展配置 Table of Contents 1. 动机之反思 2. 它山之石 3. 扩展的管理 4. 我额外安装的通用扩展(在purcell基础上) 5. LaTex相关的问题和配置 6 ...

  9. entity_class实体类

    对应数据库中表,并继承基础模型类~

  10. Laravel 引入自定义类库或第三方类库

    强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况.!!当然,没有命名空间也可以使用,就是类名字(非文件名)最好复杂一些.(重复也不要紧,程序会自己判断) laravel5.4中如 ...