题意分析

首先 要求起点终点不连通

再结合数据范围 就是最小割了

首先我们可以建一个图出来

如果\(x\)可以到\(y\)的话

那么我们就从\(x\)向\(y\)连一条代价为\(h[x]-h[y]+1\)的边 代表不联通的代价

可是如果存在以下情况呢

如果我们选择切断\(c\)到\(d\)的边的话

实际上我们也切断了\(a\)到\(c\)以及\(b\)到\(c\)

所以我们可以这么建

然后跑最大流就可以了

由于起点以及终点不可以被修改

所以我忽视了别的点到起点的连边

同时别的点到终点的连边边权都是\(inf\)

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 88
#define IL inline
#define M 5008611
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int T;ll ans;
int n,m,tot=1,sx,sy,tx,ty;
int hei[N][N],to[M],nex[M],head[N*N*5],w[M];
int dep[5*N*N],cur[5*N*N];
vector<pair<int,int> > G[N*N];
queue<int> Q;
bool vis[N][N];
int tox[6]={0,0,0,1,-1},toy[6]={0,1,-1,0,0};
IL int id(int x,int y){return (x-1)*m+y;}
IL bool safe(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
IL void add(int x,int y,int z)
{to[++tot]=y;nex[tot]=head[x];head[x]=tot;w[tot]=z;
swap(x,y);to[++tot]=y;nex[tot]=head[x];head[x]=tot;w[tot]=0;}
IL bool bfs()
{
for(R int i=1;i<=5*n*m;++i) dep[i]=0;
Q.push(id(sx,sy));dep[id(sx,sy)]=1;
for(;!Q.empty();)
{
int u=Q.front();Q.pop();
for(R int i=head[u];i;i=nex[i])
{
int v=to[i];
if(w[i]>0&&dep[v]==0)
{
dep[v]=dep[u]+1;Q.push(v);
}
}
}
return dep[id(tx,ty)]!=0;
}
IL int dfs(int now,int res)
{
if(now==id(tx,ty)||res==0) return res;
for(R int &i=cur[now];i;i=nex[i])
{
int v=to[i];
if(w[i]>0&&dep[v]==dep[now]+1)
{
int have=dfs(v,min(w[i],res));
if(have>0)
{
w[i]-=have;w[i^1]+=have;
return have;
}
}
}
return 0;
}
IL void Dinic()
{
while(bfs())
{
for(R int i=1;i<=5*n*m;++i) cur[i]=head[i];
int d=dfs(id(sx,sy),inf);
while(d) ans+=d,d=dfs(id(sx,sy),inf);
}
}
int main()
{
freopen("ski.in","r",stdin);
freopen("ski.out","w",stdout);
read(T);
while(T--)
{
read(n);read(m);read(sx);read(sy);read(tx);read(ty);
tot=1;ans=0;memset(head,0,sizeof head);
for(R int i=1;i<=n;++i)
for(R int j=1;j<=m;++j)
read(hei[i][j]);
if(abs(sx-tx)+abs(sy-ty)==1) {puts("-1");continue;}
for(R int i=1;i<=n;++i)
{
for(R int j=1;j<=m;++j)
for(R int k=1;k<=4;++k)
{
int nowx=i+tox[k],nowy=j+toy[k];
if(nowx==sx&&nowy==sy) continue;
if(safe(nowx,nowy)&&hei[nowx][nowy]<=hei[i][j])
G[id(nowx,nowy)].push_back(make_pair(hei[i][j]-hei[nowx][nowy]+1,id(i,j)));
}
}
for(R int i=1;i<=n*m;++i)
{
if(G[i].size())
sort(G[i].begin(),G[i].end());
}
// for(R int i=1;i<=n*m;++i)
// {
// if(G[i].size())
// {
// for(R int j=0;j<(int)G[i].size();++j)
// printf("%d -- %d --> %d\n",G[i][j].second,G[i][j].first,i);
// }
// }
for(R int i=1;i<=n*m;++i)
{
int now=0;
if(id(tx,ty)==i)
{
for(R int j=(int)G[i].size()-1;j>=0;--j)
{
// printf("%d -- %d --> %d\n",G[i][j].second,G[i][j].first,i);
++now;
add(G[i][j].second,i+now*n*m,inf);
add(i+now*n*m,i+(now-1)*n*m,inf);
}
}
else
{
for(R int j=(int)G[i].size()-1;j>=0;--j)
{
// printf("%d -- %d --> %d\n",G[i][j].second,G[i][j].first,i);
++now;
add(G[i][j].second,i+now*n*m,inf);
add(i+now*n*m,i+(now-1)*n*m,G[i][j].first);
}
}
}
Dinic();
printf("%lld\n",ans);
for(R int i=1;i<=n*m;++i) G[i].clear();
}
fclose(stdin);
fclose(stdout);
return 0;
}

HEOI 2019 RP++

考试题 T2的更多相关文章

  1. hdu3089 Josephus again|快速约瑟夫环

    题目链接:戳我 貌似是高一昨天的考试题T2?????感觉挺好玩的就搞了搞qwqwq 其实是HDU上面的题啦.... 对于普通的约瑟夫问题,大概是n个人围成一个环,从1开始报数,数到k,那个人出队,最后 ...

  2. [Noip2016]蚯蚓 D2 T2 队列

    [Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...

  3. T2 Func<in T1,out T2>(T1 arg)

    委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...

  4. Hotelling T2检验和多元方差分析

    1.1 Hotelling T2检验 Hotelling T2检验是一种常用多变量检验方法,是单变量检验的自然推广,常用于两组均向量的比较. 设两个含量分析为n,m的样本来自具有公共协方差阵的q维正态 ...

  5. bzoj4034: [HAOI2015]T2

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2684  Solved: 843 Description 有一 ...

  6. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  7. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  8. Action<T1, T2>委托

    封装包含两个参数的方法委托,没有返回值. 语法 public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) 类型参数 in ...

  9. NOIP2013普及组 T2 表达式求值

    OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...

随机推荐

  1. mysql中timestamp简单用法

    该时间字段有比较特殊的地方,显示内容datetime字段一样.当取值为null或者不赋值时,显示当前系统时间,然后在其他地区读取的时候会根据当地的时间转换成当地的系统时间.

  2. 如何规范移动应用交互设计?UI/UX设计师须知的11个小技巧

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 十年前,手机的使用只是为了沟通. 而近几年,情况发生了很大变化,我们很难找到不使用手机的人.手机在极 ...

  3. Monokai风格的EditPlus配色方案

    EditPlus的配置文件editplus_u.ini,该文件默认在:系统盘:\Users\用户名\AppData\Roaming\EditPlus目录中.将其中的内容替换为如下即可: [Option ...

  4. Zookeeper客户端cli_st为何在crontab中运行不正常?

    实践中,发现直接在命令行终端运行cli_st时,能够得到预期的结果,但一将它放到crontab中,则只收到: bye 相关的一段clit_st源代码如下: if (FD_ISSET(, &rf ...

  5. Java: FreeMarker的配置和使用

    初学什么都不可以忽略的地方就是这个东西的官方网站:http://freemarker.org/.下载或者API都可以参考这里. FreeMarker是什么 非常的简单明了.FreeMarker是一个j ...

  6. Ubuntu的常识使用了解4

    寻找文件的「名称」 在Linux系统当中,文件的数量非常非常的多, 需要使用查找工具来高效查找指定文件位置:

  7. spark配置文件和执行部分代码

    export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER-Dspark.deploy.zookeeper.ur ...

  8. D3 datum()

    datum()和data()功能类似. datum():将指定数据赋值给被选择元素.data():将数据数组与选择集的元素结合. var p = d3.selectAll('p'); p.datum( ...

  9. DI延伸

    延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属 ...

  10. ERROR Function not available to this responsibility.Change responsibilities or contact your System Administrator.

    APPLIES TO: Navigation:  Help > Diagnostics > Custom Code > Personalize  or  Help > Diag ...