题目描述

  有一个\(n\)行\(m\)列的网格图。

  \(S\)到第一行的每一个点都有一条单向边,容量为\(\infty\)。

  最后一行的每个点到\(T\)都有一条单向边,容量为\(\infty\)。

  同一行中相邻的两个节点之间有一条无向边,\((x,y)\)和\((x,y+1)\)之间的无向边的容量为\(a_{x,y}\)。

  同一列中相邻的两个节点之间有两条有向边,\((x,y)\)到\((x+1,y)\)这条有向边的容量为\(b_{x,y}\),\((x+1,y)\)到\((x,y)\)这条有向边容量为\(\infty\)。

  求\(S\)到\(T\)的最大流。

  特别的,\(\forall i,a_{1,i}=a_{n,i}=0\)

  \(n\times m\leq 25000000\)

题解

  显然这是一个网络流。

  直接跑网络流会TLE。

  观察到这个图是一个平面图,可以把平面图网络流转化为对偶图最短路。

  怎么转化呢?

  首先你要会无向边的平面图网络流(可以百度/google)。

  有向边的连边方法和无向边的类似。

  对于一条有向边\(x\rightarrow y\),容量为\(z\)的有向边(网络流最后都是在有向边上面跑的),从\(x\rightarrow y\)这条有向边的左边对应的这个区域连一条边到右边的这个区域,权值为\(z\)。

  最后跑一次最短路就行了。

  这道题中从下往上的边的容量为\(\infty\),所以对偶图中从左往右的边的权值为\(\infty\),也就是说最短路的每一步只会向上/下/左走,这就可以DP了。

  设\(f_{i,j}\)为走到\((x,y)\)右下方那个区域的最短路

\[f_{i,j}=\min(f_{i-1,j}+a_{i,j},f_{i+1,j}+a_{i+1,j},f_{i,j+1}+b_{i+1,j})
\]

  时间复杂度:\(O(nm)\)

  我的代码中把左右反过来了

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void sort(int &a,int &b)
{
if(a>b)
swap(a,b);
}
void open(const char *s)
{
#ifndef ONLINE_JUDGE
char str[100];
sprintf(str,"%s.in",s);
freopen(str,"r",stdin);
sprintf(str,"%s.out",s);
freopen(str,"w",stdout);
#endif
}
int rd()
{
int s=0,c;
while((c=getchar())<'0'||c>'9');
do
{
s=s*10+c-'0';
}
while((c=getchar())>='0'&&c<='9');
return s;
}
void put(int x)
{
if(!x)
{
putchar('0');
return;
}
static int c[20];
int t=0;
while(x)
{
c[++t]=x%10;
x/=10;
}
while(t)
putchar(c[t--]+'0');
}
int upmin(int &a,int b)
{
if(b<a)
{
a=b;
return 1;
}
return 0;
}
int upmax(int &a,int b)
{
if(b>a)
{
a=b;
return 1;
}
return 0;
}
int *a;
int n,m;
int A,B,Q;
int down(int x,int y)
{
return a[(x-1)*m+y];
}
int right(int x,int y)
{
return a[(n-1)*m+(x-2)*(m-1)+y];
}
ll *f;
int main()
{
open("c");
scanf("%d%d",&n,&m);
a=new int[(n-1)*m+(n-2)*(m-1)+1];
scanf("%d%d%d%d",&A,&B,&Q,&a[0]);
for(int i=1;i<=(n-1)*m+(n-2)*(m-1);i++)
a[i]=((ll)a[i-1]*A+B)%Q;
f=new ll[n];
for(int i=1;i<n;i++)
f[i]=0;
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
f[j]+=down(j,i);
for(int j=2;j<n;j++)
f[j]=min(f[j],f[j-1]+right(j,i));
for(int j=n-2;j>=1;j--)
f[j]=min(f[j],f[j+1]+right(j+1,i));
}
ll ans=0x7fffffffffffffffll;
for(int i=1;i<n;i++)
ans=min(ans,f[i]+down(i,m));
printf("%lld\n",ans);
return 0;
}

【XSY2849】陈姚班 平面图网络流 最短路 DP的更多相关文章

  1. 省队集训 Day3 陈姚班

    [题目大意] 给一张网格图,上往下有流量限制,下往上没有,左往右有流量限制. $n * m \leq 2.5 * 10^6$ [题解] 考场直接上最大流,50分.竟然傻逼没看出狼抓兔子. 平面图转对偶 ...

  2. 200万年薪请不到!清华姚班到底有多牛X?

    前几天,清华大学自动化系2020年大一新生的C++作业因为太难而上了热搜,该话题在知乎上的热度一度高达 1300+ 万.  在该帖子下方,有很多关于这件事的讨论,其中很多不禁赞叹"清华太牛 ...

  3. 中国 AI 天才养成计划:清华姚班和 100 个「张小龙」

    https://daily.zhihu.com/story/9653612?from=timeline&isappinstalled=0   AI财经社,专注未来,以及更好的生活 真正的 AI ...

  4. zz姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖

    姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖 近日,美国艾尔弗·斯隆基金会(The Alfred P. Sloan Foundation)公布了2019年斯隆研究奖(Sloan Research ...

  5. 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...

    初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...

  6. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. BZOJ_1003_[ZJOI2006]物流运输_最短路+dp

    BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...

  8. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  9. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

随机推荐

  1. 不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。

    SQLServer数据库通常都不建议进行SHRINKFILE操作,因为SHRINKFILE不当会造成一定的性能问题. 但是当进行了某些操作(例如某个超大的日志类型表转成分区表切换了数据文件),数据库某 ...

  2. python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写

    python3的re模块使用过程中,正则的书写遇到了一些问题,就是使用.*?能不能匹配到换行符的问题. 答案是不能. 如果在匹配过程中遇到了也没关系,加上这个语句就好: \s+

  3. XML详解一XML语法

    XML指可扩展标记语言很类似 HTML,被设计用来传输和存储数据而非显示数据,XML标签没有被预定义需要自行定义标签,标签具有自我描述性,同时XML也是 W3C 的推荐标准. 先来写一个XML脚本de ...

  4. 获取高精度时间注意事项 (QueryPerformanceCounter , QueryPerformanceFrequency)

    花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊- 曾经据说是处理器的cycle counter,但 ...

  5. 验证二叉搜索树的golang实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索树. ...

  6. TNS-12535/12606 and ORA-3136 on Connection to Database (Doc ID 2313573.1)

    今天遇到一问题 telnet 都是通的,但是两台数据库服务器还是无法 sqlplus 连接 ,最后发现 两台服务器的 mtu 值不同,其中一台为 1500 一台为9000, 以前只是认为 telnet ...

  7. spring boot拦截器中获取request post请求中的参数(转)

    文章转自 https://www.jianshu.com/p/69c6fba08c92

  8. 关于Eclipse的版本、分支、衍生版本

    Eclipse 简介: Eclipse的历史: Eclipse的发布版本: Eclipse分支: 关于不同分支版本的区别,点击链接: http://www.eclipse.org/downloads/ ...

  9. ELK原理与简介

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...

  10. Python学习--Python变量类型

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...