一道不算太难的题目

但是真的很恶心

显然,对于第一问,我们直接无脑打模板就好了

第二问也不是很难,我们将每条边再连一条容量为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网络扩容题解的更多相关文章

  1. BZOJ 1834 网络扩容 最大流+最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题目大意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是 ...

  2. BZOJ 1834 网络扩容(最大流+费用流)

    对于第一问,直接求最大流. 对于第二问,建源点s和汇点t,s连1容量为INF,费用为0的边,n连t容量为最大流+k,费用为0的边.这样就把最大流限制为最多增加k了. 限制需要求扩充的最小费用,原图的边 ...

  3. BZOJ1834:[ZJOI2010]网络扩容——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...

  4. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  5. BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)

    第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然  后跑最小费用最大流就OK了. ---- ...

  6. bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...

  7. 【题解】Luogu P2604 [ZJOI2010]网络扩容

    原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...

  8. 【bzoj1834】[ZJOI2010]network 网络扩容

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2701  Solved: 1368[Submit ...

  9. C++之路进阶——codevs1362(网络扩容)

    1362 网络扩容 省队选拔赛  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 给定一张有向图,每条边都有一个容量 ...

随机推荐

  1. springmvc:自定义类型转换器代码编写

    字符串转换日期: 1.自定义一个类 /** * 字符串转换日期 */ public class StringToDateConverter implements Converter<String ...

  2. openldap 2.4 centos7 常用配置

    新版的openldap弃用了sldap.conf配置文件,引入一种动态配置,所以尽量不要直接修改配文件 如果直接修改了配置文件可以用slaptest -u命令检查 1.安装openldap,可能需要e ...

  3. php+js实现百度地图多点标注的方法

    本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...

  4. spring深入学习(六)-----springmvc

    MVC设计模式 有过一定开发经验的人肯定都知道这个模式,先简单介绍下这种模式,然后再去讨论为啥要这么设计: 传统的web应用中应该主要包括这些组件,不同组件负责不同的模块. 数据实体:POJO 数据层 ...

  5. Hibernate4的注解 (持续更新范例中)

    作用:使得Hibernate程序的开发大大的简化.利用注解后,可不用定义持久化类对应的*.hbm.xml,而直接以注解方式写入持久化类的实现中. 注解配置持久化类常用注解. 注解 含义和作用 @Ent ...

  6. day 52

    目录 静态文件配置 form表单默认是get请求 request方法的初识 数据库的迁移命令 静态文件配置 默认情况下所有的html文件都放在templates文件夹内 什么是静态文件 网站所使用到的 ...

  7. MySQL--python关联MySQL、练习题

    1.python关联MySQL pymysql: 安装:pip3 install pymysql 1.0:连接到数据库中 import pymysql conn = pymysql.connect( ...

  8. VUE.之安装 font-awesome

    VUE.之安装 font-awesome 我们在项目中经常使用各种图标:font-awesome (http://fontawesome.dashgame.com/) 1.npm 安装font-awe ...

  9. top进程命令

    top命令用来显示系统当前的进程状况. 格式:top [选项] 主要选项如下. d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c: ...

  10. redis的安装,以及主从实现同步

    Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构.下面我演示下怎样在多台服务器上进行Redi ...