CCF CSP 201703-5 引水入城(50分)
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址
CCF CSP 201703-5 引水入城
问题描述
这片管网由 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 列管道单位时间的容量。
输出格式
注意计算过程中有些参数可能超过32位整型表示的最大值,请注意使用64位整型存储相应数据。
样例输入
样例输出
样例说明
在标准答案中,单位时间可以引水 38 单位。所有纵向管道均向下抽水即可,不需要横向管道抽水,也不需要向上放水。
样例输入
样例输出
样例输入
样例输出
样例输入
样例输出
评测用例规模与约定
| 测试点编号 | n | m |
| 1 | =2 | =1000 |
| 2 | =1000 | =2 |
| 3 | =1000 | =2 |
| 4 | =5 | =5 |
| 5 | =10 | =10 |
| 6 | =100 | =100 |
| 7 | =500 | =500 |
| 8 | =1000 | =1000 |
| 9 | =2000 | =2000 |
| 10 | =5000 | =5000 |
解析
这是一个最大流的问题,湖是源,城市是汇。
下面实现了ford-fulkerson算法,只能通过50%的数据。
有更好的方法求告知!
代码
C++
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <climits>
using namespace std; long long A, B, Q, X;
int numVertex; int nextRandom() {
X = (A * X + B) % Q;
return X;
} struct Edge {
int v; // vertex
int w; // weight
Edge(int v_, int w_) : v(v_), w(w_) {}
}; bool bfs(vector<vector<Edge> > &rgraph, int s, int t, vector<pair<int,int> > &parents) {
queue<int> q;
vector<bool> visited(numVertex);
q.push(s);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i=; i<rgraph[u].size(); i++) {
int v = rgraph[u][i].v;
if(!visited[v] && rgraph[u][i].w>) {
visited[v] = true;
parents[v] = make_pair(u,i);
q.push(v);
if(v == t) return true;
} }
}
return false;
} long long fordFulkerson(vector<vector<Edge> > &rgraph, int s, int t) {
long long maxFlow = ;
vector<pair<int,int> > parents(numVertex);
while(bfs(rgraph, , , parents)) {
int pathFlow = INT_MAX;
for(int v=t; v!=s; ) {
int u=parents[v].first; int ui = parents[v].second;
pathFlow = min(pathFlow, rgraph[u][ui].w);
v = u;
}
maxFlow += pathFlow;
// cout << pathFlow << " " << maxFlow << endl;
for(int v=t; v!=s; ) {
int u = parents[v].first;
int ui = parents[v].second;
if(rgraph[u][ui].w!=INT_MAX) rgraph[u][ui].w -= pathFlow;
int vi = -;
for(int i=; i<rgraph[v].size(); i++) {
if(rgraph[v][i].v == u) {
vi = i;
}
}
if(vi!=- && rgraph[v][vi].w!=INT_MAX) rgraph[v][vi].w += pathFlow;
v = u;
}
}
return maxFlow;
} int main() {
int N, M;
cin >> N >> M >> A >> B >> Q >> X;
numVertex = N * M + ;
// 0:source, 1:sink,
vector<vector<Edge> > graph(numVertex, vector<Edge>()); int offset = ;
// construct graph
for(int n=; n<N-; n++) {
for(int m=; m<M; m++) {
int from = n*M+m+offset;
int to = from+M;
nextRandom();
graph[from].push_back(Edge(to, X));
graph[to].push_back(Edge(from, INT_MAX));
}
} for(int m=; m<M; m++) {
int from = ;
int to = m+offset;
graph[from].push_back(Edge(to, INT_MAX));
} for(int m=; m<M; m++) {
int from = (N-)*M+m+offset;
int to = ;
graph[from].push_back(Edge(to, INT_MAX));
} long long maxFlow = ; for(int n=; n<N-; n++) {
for(int m=; m<M-; m++) {
int from = n*M+m+offset;
int to = from+;
nextRandom();
graph[from].push_back(Edge(to, X));
graph[to].push_back(Edge(from, X));
}
} maxFlow += fordFulkerson(graph, , ); cout << maxFlow;
}
CCF CSP 201703-5 引水入城(50分)的更多相关文章
- CCF(引水入城:60分):最大流+ISAP算法
引水入城 201703-5 这从题目分析来看很像最大流的问题,只需要增加一个超级源点和一个超级汇点就可以按照题意连边再跑最大流算法. 因为数据量太大了,肯定会超时.但是没有想到可行的解决方法. #in ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- vijos p1777 引水入城(bfs+贪心)
引水入城 描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远 ...
- NOIP2010 引水入城
4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...
- Luogu 1514 引水入城 (搜索,动态规划)
Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
随机推荐
- sql server 日志文件占用过多空间
问题描述: 在sql server的log文件夹中存在大量的mdmp.log文件,整体占用了几十个G C:\Program Files (x86)\Microsoft SQL Server\MSSQL ...
- MAC下 Apache服务器配置
今天做了一个注册登录提交的页面,后续操作需要用到后端的知识 php+Mysql,之前只是有些了解,现在开始具体操作了,首先从配置环境开始.查了好几篇文档与博客,了解了挺多知识. Mac下Apache服 ...
- windows查找端口占用/ 终结端口占用 ------------windows小技巧
前沿 我是一名小程序员,经常通过一些类似tomcat,jettry 等服务器工具 调试项目.有时候莫名其妙的就会出现 程序关闭不正常的情况!去查端口又死活找不到!最后只能重启电脑 后面,在网上查了一些 ...
- HashMap源码分析-基于JDK1.8
hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...
- 2017 清北济南考前刷题Day 2 morning
期望得分:100+30+60=190 实际得分:100+30+30=160 T1 最优方案跳的高度一定是单调的 所以先按高度排序 dp[i][j] 跳了i次跳到j 枚举从哪儿跳到j转移即可 #incl ...
- openGL笔记-画基本图形
#include "iostream" #include <GL/glut.h> #include<cmath> #include<vector> ...
- http请求头和响应头详细解释
想对http请求头和响应头有更细致的了解,请看如下 Requests部分 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/htm ...
- div+css+jQuery简单实现投票功能
昨天看到C#群里有人问一个投票功能如何实现... 我对此很感兴趣,为了练习一下,就有了以下代码. 投票功能使用jQuery实现..纯html代码...数据通过json字符串传递,通过 eval转换为j ...
- STL-pair
每个pair 可以存储两个值.这两种值无限制. 定义 pair<int,char> p; pair<string,int> p; pair<int,int> p; ...
- python初步学习-Python模块之 re
re 正则表达式 python正则表达式在线检验网站 python re正则表达式语法 匹配字符 语法 解释 表达式 匹配实例 . 匹配任意除"\n"以外的任何字符 a.c abc ...