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 给定一张有向图,每条边都有一个容量 ...
随机推荐
- 点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?
点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决? window.open("page1.html","win1"); 这句 ...
- Windows 禁用Windows updata服务
方法一:禁用Windows updata服务 按WIN+R 打开运行,输入 services.msc 回车 然后找到 “Windows updata”服务,双击后设置为禁用 应用即可; 方法二:推迟自 ...
- [BZOJ2427][HAOI2010]软件安装-tarjan缩点-树上dp
<题面> 这个题真伤人 之前Tarjan和树规都没学好,吃了不少亏,仔仔细细的搞了一天,收获颇丰 先来一个Tarjan的链接:$\mathbb{O}$ 题目的数据比较友好: $dp$不对: ...
- vim 查找及替换
#全文(%)查找(s)行首2个空格开头(/^ ), 替换(g)为无即删掉(//) :%s/^ //g #全文查找每行尾的2个空格,删除 :%s/ $//g
- mysql_example
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysq ...
- .NET框架之---MEF托管可扩展框架
MEF简介: 今天学习了下MEF框架,MEF,全称Managed Extensibility Framework(托管可扩展框架).MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段 ...
- Python3数据分析与挖掘建模实战
Python3数据分析与挖掘建模实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...
- 内核、中断和网络 $ sysctl -a | grep ...$ cat /proc/interrupts$ cat /proc/net/ip_conntrack /* may take some time on busy servers */$ netstat$ ss -s
你的中断请求是否是均衡地分配给CPU处理,还是会有某个CPU的核因为大量的网络中断请求或者RAID请求而过载了? SWAP交换的设置是什么?对于工作站来说swappinness 设为 60 就很好, ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- Django项目:CRM(客户关系管理系统)--14--06PerfectCRM实现King_admin注册功能获取内存优化处理
<th >{% get_app_name admin_class.model %}{{ admin_class }} </th> #kingadmin_tags.py # —— ...