BZOJ 1834网络扩容题解
一道不算太难的题目
但是真的很恶心
显然,对于第一问,我们直接无脑打模板就好了
第二问也不是很难,我们将每条边再连一条容量为inf,费用为w的边
但是流量只要小于第一问的答案加k就行了
所以我们增加一个点为第二问的汇点,将n与它连接一条容量为ans+k,费用为0的边
跑费用流就好了
但是!!!!!!!
这样作只有40分,为什么呢。
因为虽然数据范围说n<=1000但给的点编号有大于1000的点。。。。。
我们只要将点数视为5000就可以过来了
真的恶心。。。。
不过在考场上还是建议用离散化,毕竟你不知道点数编号的范围
想问一问当初省选时有多少人被这个给坑了。。
# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
# include<cstring>
# include<queue>
using namespace std;
const int mn = ;
const int inf = 0xfffffff;
struct edge{
int to,next,flow,cup,cost;
edge(){to=flow=cup=cost=,next=-;}
};
edge e[mn*];
int head[mn],edge_max=-;
void add(int x,int y,int k,double c)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
e[edge_max].flow=e[edge_max].cup=k;
e[edge_max].cost=c;
head[x]=edge_max;
}
int n,m,k;
int ans1,ans2;
int deep[mn];
int cur[mn];
queue<int> q;
bool bfs(int x,int y)
{
memset(deep,,sizeof(deep));
q.push(x);
deep[x]=;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=e[i].next)
{
if(deep[e[i].to]== && e[i].flow> )
{
deep[e[i].to]=deep[u]+;
q.push(e[i].to);
}
}
}
if(deep[y]==)
return false;
else return true;
}
int dfs(int x,int dist,int y)
{
if(x==y)
return dist;
for(int &i=cur[x];i!=-;i=e[i].next)
{
if(deep[e[i].to]==deep[x]+ && e[i].flow!=)
{
int di=dfs(e[i].to,min(dist,e[i].flow),y);
if(di>)
{
e[i].flow-=di;
e[i^].flow+=di;
return di;
}
}
}
return ;
}
void dinic(int x,int y)
{
while(bfs(x,y))
{
for(int i=;i<=n;i++)
cur[i]=head[i];
while(int k=dfs(x,inf,y))
ans1+=k;
}
}
int dis[mn];
int pe[mn],pv[mn];
bool vis[mn];
bool spfa(int x,int y)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n+;i++)
dis[i]=inf;
dis[x]=;
vis[x]=;
q.push(x);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=e[i].next)
{
if(dis[u]+e[i].cost<dis[e[i].to] && e[i].flow>)
{
dis[e[i].to]=e[i].cost+dis[u];
pe[e[i].to]=i;
pv[e[i].to]=u;
if(!vis[e[i].to])
{
q.push(e[i].to);
vis[e[i].to]=;
}
}
}
}
if(dis[y]!=inf)
return true;
else return false;
}
void max_flow(int x,int y)
{
while(spfa(x,y))
{
int mflow=inf;
for(int i=y;i!=x;i=pv[i])
{
mflow=min(mflow,e[pe[i]].flow);
}
ans2+=dis[y]*mflow;
for(int i=y;i!=x;i=pv[i])
{
e[pe[i]].flow-=mflow;
e[pe[i]^].flow+=mflow;
}
}
}
int a1[mn],a2[mn],a3[mn],a4[mn];
void pre()
{
memset(head,-,sizeof(head));
memset(e,-,sizeof(e));
for(int i=;i<=m;i++)
{
add(a1[i],a2[i],a3[i],);
add(a2[i],a1[i],,);
add(a1[i],a2[i],inf,a4[i]);
add(a2[i],a1[i],,-a4[i]);
}
}
int main()
{
int x,y,c,w;
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&a1[i],&a2[i],&a3[i],&a4[i]);
add(a1[i],a2[i],a3[i],);
add(a2[i],a1[i],,);
}
dinic(,n);
pre();
add(n,n+,ans1+k,);
add(n+,n,,);
max_flow(,n+);
printf("%d %d",ans1,ans2);
return ;
}
BZOJ 1834网络扩容题解的更多相关文章
- BZOJ 1834 网络扩容 最大流+最小费用流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题目大意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是 ...
- BZOJ 1834 网络扩容(最大流+费用流)
对于第一问,直接求最大流. 对于第二问,建源点s和汇点t,s连1容量为INF,费用为0的边,n连t容量为最大流+k,费用为0的边.这样就把最大流限制为最多增加k了. 限制需要求扩充的最小费用,原图的边 ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- 【BZOJ】【1834】【ZJOI2010】Network 网络扩容
网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...
- BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)
第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然 后跑最小费用最大流就OK了. ---- ...
- bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...
- 【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...
- 【bzoj1834】[ZJOI2010]network 网络扩容
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2701 Solved: 1368[Submit ...
- C++之路进阶——codevs1362(网络扩容)
1362 网络扩容 省队选拔赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给定一张有向图,每条边都有一个容量 ...
随机推荐
- golang中函数类型
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时 ...
- [BZOJ2729]排队
数学知识 排列 A(n,m)从n个元素中选出m个的不同的排列数 A(n,m)=n!/(n-m)! 组合 C(n,m)从n个元素中选出m个的不同的方案数 C(n,m)=n!/(m!*(n-m)! ...
- TZ_13_Hystix的熔断器
1.作用:当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果. 熔断器的三种状态: Closed:关闭状态(断路器关闭),所有请求都正 ...
- union 和order by 使用时排序不正确
静态专题和APP版专题(order by不起作用): [query] sql=(select sp_f13577,sp_f13576 from sp_t113 where url_1 not like ...
- centos安装消息队列beanstalkd
起因:开始想在windows安装beanstalkd,可以找了很多资料都没有成功.最终还是妥协.在虚拟机上装一个centos系统,然后在centos上安装beanstalkd供windows使用 yu ...
- H5C3--仿京东首页(包含轮播图,倒计时)
!!!很抱歉,之前的域名已经过期了,已经被别人购买了拿去做菠菜了,现在的话,京东页面我重新发布一下代码 #请看注意事项,因为有模拟请求,请在本地服务器或者IDEA类编译器打开(2019年10月10日0 ...
- SPSS正交设计的操作
SPSS正交设计的操作 设要做二因素的正交设计,A因素有三个水平,B因素有两个水平.则选择Data-->Orthogonal Design-->generate,弹出的就是正交设计窗口: ...
- oracle定制定时执行任务
1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以使用任务计划来实现, 对于winXP系统,设置步骤如下,开始---设置---控制面板-- ...
- Android 对保存在 sharedpreference的重要数据进行编解码
有时候为了登录方便会将用户名和密码保存在 sharedpreference里面,可是如果不加以处理密码将以明文保存. 在Android中java层提供了工具类:android.util.Base64; ...
- js读取解析JSON数据(转)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...