题面:

问题描述
  MF城建立在一片高原上。由于城市唯一的水源是位于河谷地带的湖中,人们在坡地上修筑了一片网格状的抽水水管,以将湖水抽入城市。如下图所示:
  
  这片管网由 n 行 m 列节点(红色,图中 n = 5,m = 6),横向管道(紫色)和纵向管道(橙色)构成。
  行和列分别用 1 到 n 的整数和 1 到 m 的整数表示。第 1 行的任何一个节点均可以抽取湖水,湖水到达第 n 行的任何一个节点即算作引入了城市。
  除第一行和最后一行外,横向相邻或纵向相邻的两个节点之间一定有一段管道,每一段管道都有各自的最大的抽水速率,并需要根据情况选择抽水还是放水。对于纵向的管道(橙色),允许从上方向下方抽水或从下方向上方放水;如果从图中的上方向下方抽水,那么单位时间内能通过的水量不能超过管道的最大速率;如果从下方向上方放水,因为下方海拔较高,因此可以允许有任意大的水量。对于横向的管道(紫色),允许从左向右或从右向左抽水,不允许放水,两种情况下单位时间流过的水量都不能超过管道的最大速率。
  现在MF城市的水务负责人想知道,在已知每个管道单位时间容量的情况下,MF城每单位时间最多可以引入多少的湖水。
  输入格式
  由于输入规模较大,我们采用伪随机生成的方式生成数据。
  每组数据仅一行包含 6 个非负整数 n, m, A, B, Q, X0。其中,n 和 m 如前文所述,表示管网的大小,保证 2 ≤ n, m ≤ 5000;保证 1 ≤ A, B, Q, X0 ≤ 109。
  A, B, Q, X0 是数据生成的参数,我们用如下的方式定义一个数列 { Xi }:
  Xi+1 = ( AXi + B) mod Q, (i ≥ 0)
  我们将数列的第 1 项到第 (n-1)m 项作为纵向管道的单位时间容量,其中 X(s-1)m+t 表示第 s 行第 t 列的节点到第 s+1 行第 t 列管道单位时间的容量;将数列的第 (n-1)m+1 项到第 (n-1)m+(n-2)(m-1) 项(即接下来的 (n-2)(m-1) 项)作为横向管道的单位时间容量,其中 X(n-1)m+(s-2)(m-1)+t 表示第 s 行第 t 列的节点到第 s 行第 t+1 列管道单位时间的容量。
输出格式
  输出一行一个整数,表示MF城每单位时间可以引入的水量。
  注意计算过程中有些参数可能超过32位整型表示的最大值,请注意使用64位整型存储相应数据。
样例输入
3 3 10 3 19 7
样例输出
38
样例输入
2 5 595829232 749238243 603779819 532737791
样例输出
1029036148
样例输入
5 2 634932890 335818535 550589587 977780683
样例输出
192923706
样例输入
5 5 695192542 779962396 647834146 157661239
样例输出
1449991168
时间限制: 2.0s
内存限制: 512.0MB

分析及思路:

很容易看出这是一个网络流最大流的模型,以湖为源点,城市为汇点按要求建图即可,但有一个问题,那就是数据规模,极限数据下m==5000,n==5000,这么一来就相当于有2.5*1e7个点,并且边数是点数的三四倍左右,这样建图肯定会mle,就算内存够大,2s的时间限制也会导致程序tle,所以网络流是过不了这道题的所有数据的,经过仔细观察后发现,这些图点都是层次分明的,而且n行的点的水流的最大值与n-1行有关,貌似可以用dp?
博主首先尝试了一下dinic,加了多路增广及炸点优化依然只得了60分,后面的数据t掉了。先留个坑,去研究一下dp的做法,回来补上。
首先讲几个潜在的坑(或者说审题不仔细弄错的地方)

1.横向边是无向边,意味着正边和反边flow一样。
2.纵向边从上往下有限制,从下往上没有限制。

然后是60分的网络流代码:

#include<iostream>
#include<queue>
#include<cstring>
#define rep(i,x,n) for(ll i=x;i<n;i++)
#define per(i,x,n) for(ll i=n-1;i>=x;i--)
#define nxt(x) x=((a*x)+b)%q
using namespace std;
//head
typedef long long ll;
const ll maxn=5e6,ha=1<<30;
int n,m,num,head[maxn],flag[maxn],cur=0,t;
ll x,a,b,q;
struct Edge{int to,next;ll flow;}edge[6*maxn];
void addedge(ll q,ll w,ll x)
{edge[cur].to=w;edge[cur].next=head[q];head[q]=cur;edge[cur].flow=x;cur++;edge[cur].to=q;edge[cur].next=head[w];head[w]=cur;edge[cur].flow=0;cur++;
}
void addedge1(ll q,ll w,ll x)
{edge[cur].to=w;edge[cur].next=head[q];head[q]=cur;edge[cur].flow=x;cur++;edge[cur].to=q;edge[cur].next=head[w];head[w]=cur;edge[cur].flow=9999999999999;cur++;
}
void addedge2(ll q,ll w,ll x)
{edge[cur].to=w;edge[cur].next=head[q];head[q]=cur;edge[cur].flow=x;cur++;edge[cur].to=q;edge[cur].next=head[w];head[w]=cur;edge[cur].flow=x;cur++;
}
int bfs()
{memset(flag,0,sizeof(flag));queue<ll>qq;qq.push(0);flag[0]=1;while(!qq.empty()){int p=qq.front();qq.pop();for(int i=head[p];i!=-1;i=edge[i].next){if(!flag[edge[i].to]&&edge[i].flow)flag[edge[i].to]=flag[p]+1,qq.push(edge[i].to);}}return flag[t];
}
ll dfs(ll fl,int num)
{if(num==t)return fl;ll f=0;for(int i=head[num];i!=-1&&fl;i=edge[i].next){if(flag[edge[i].to]==flag[num]+1&&edge[i].flow){ll x=dfs(min(fl,edge[i].flow),edge[i].to);fl-=x;f+=x;edge[i].flow-=x;edge[i^1].flow+=x;}}if(!f)flag[num]=-2;return f;
}
ll maxflow()
{ll ret=0;while(bfs()){ret+=dfs(ha,0);}return ret;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m>>a>>b>>q>>x;memset(head,-1,sizeof(head));ll tmp=(n-1)*m;t=n*m+1;rep(i,1,m+1){addedge(0,i,999999999999);}rep(i,1,m+1){addedge(tmp+i,t,9999999999999);}rep(i,0,n-1)rep(j,1,m+1){nxt(x);num=i*m+j;addedge1(num,num+m,x);}rep(i,1,n-1)rep(j,1,m){nxt(x);num=i*m+j;addedge2(num,num+1,x);}cout<<maxflow()<<endl;return 0;
}

版权声明:本文为原创文章,转载请标明出处。
https://blog.csdn.net/u014390156

ccf201703-5 引水入城相关推荐

  1. codevs 1066 引水入城(DFS+DP)

    codevs 1066 引水入城 题目描述 Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政 区划十分特殊,刚好构成一个N行M列的矩形,如上图所示, ...

  2. NOIP 2010 引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...

  3. CCF201703-5 引水入城(100分题解链接)

    试题编号: 201703-5 试题名称: 引水入城 时间限制: 2.0s 内存限制: 512.0MB 问题描述: 问题描述 MF城建立在一片高原上.由于城市唯一的水源是位于河谷地带的湖中,人们在坡地上 ...

  4. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

    1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...

  5. Codevs 1066 引水入城 2010年NOIP全国联赛提高组 BFS + 贪心

    Codevs 1066 引水入城 题目上没有给出样例二,只给出了样例二的图,真是奇怪(丧心病狂). Input2: 3 6 8 4 5 6 4 4 7 3 4 3 3 3 3 2 2 1 1 2 Ou ...

  6. 【NOIP2010】引水入城

    Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海 ...

  7. P1514 引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  8. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  9. noip2010引水入城-搜索+贪心

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  10. 引水入城(dfs的做法)洛谷p1514

    在这道题中, 由于每个点所能到达的地方是一定的,并且若底层能够填满,那么到达底层的位置一定 所以我们可以把每个点所到达的最底层记录下来,若访问到某一之前到达过的点,直接用这个点所到达的底层的点更新即可 ...

最新文章

  1. 10-flutter 使用http包请求和网络指示器
  2. win10网络邻居看到linux,在Deepin 20系统中网络共享Windows无法访问的另类解决方法...
  3. jQuery (DOM篇)
  4. php mssql image,php5连接mssql2005数据库表中的image字段图片显示
  5. 数学公式编辑器 linux,linux下的公式编辑器
  6. leetcode-189-旋转数组
  7. lambda表达式优化反射_反射选择器表达式
  8. java中PL层_安装pljava - RuralHunter的个人空间 - OSCHINA - 中文开源技术交流社区
  9. Wpf 数据绑定简介、实例1
  10. C#中的Switch语句【C#】
  11. java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator
  12. git add后取消_满满干货!——Git知识总结
  13. iptables与Netfilter概念
  14. 服务器位置不可用,服务器的MSDTC不可用解决办法
  15. DLL注入explorer.exe进程
  16. 萤火虫小程序_线上服务不断档 萤火虫水洞·地下大峡谷推出“云旅游”新体验...
  17. win7启动黑屏安全模式下卸载驱动图解
  18. csgo/5e机器码解封方法,永久性解除,重装系统都不掉
  19. python win32gui模块详解_Python笔记_第二篇_基本功_4.常用模块的简单使用_窗体控制模块(win32con、win32gui)...
  20. 股票爆仓应该具体怎么办呢?股票爆仓常见的危险是什么?

热门文章

  1. python开发单片机仿真软件_开源电子电路仿真模拟软件,加油国产芯片
  2. c#生成二维码,一维码(条形码)
  3. win10桌面管理文件收纳_win10系统关闭桌面文件收纳盒的详细方法介绍
  4. 音乐播放器 - iOS开发
  5. 共享单车租用频次分析
  6. Java学习里程-----Java基础_26 BigDecimal类
  7. vs2017 开关“/NOENTRY”只与 DLL 兼容;链接时不使用“/NOENTRY”
  8. phpstorm php代码补全,基本代码补全:补全名称和关键字
  9. iPhone加码“独立王国” 有可能成摆设?
  10. 从“Liskov替换原则”和“Refused Bequest”看“正方形为什么不能继承长方形”