[Luogu 2604] ZJOI2010 网络扩容

<题目链接>


第一问直接最大流。

第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流。

大约是第一次用 namespace 封装,感觉还好。

#include <cstdio>
#include <cstring>
#include <queue>
using std::min;
using std::queue;
const int MAXN=1010,MAXM=10010,INF=0x3f3f3f3f;
int n,m,k,S,T,cnt,head[MAXN];
struct Edge
{
int nxt,to,w,f;
Edge(int nxt=0,int to=0,int w=0,int f=0):nxt(nxt),to(to),w(w),f(f){}
}e[MAXM<<1];
void AddEdge(int u,int v,int w,int f)
{
e[++cnt]=Edge(head[u],v,w,f),head[u]=cnt;
}
void AddEdges(int u,int v,int w,int f)
{
AddEdge(u,v,w,f),AddEdge(v,u,0,-f);
}
struct Query
{
int u,v,c,w;
void Init(void)
{
scanf("%d %d %d %d",&u,&v,&c,&w);
AddEdges(u,v,c,0);
}
void Rebuild(void)
{
AddEdges(u,v,INF,w);
}
}a[MAXM];
namespace MaxiumFlow
{
static int dis[MAXN],cur[MAXN];
bool BFS(void)
{
queue<int> q;
memset(dis,0,sizeof dis);
q.push(S),dis[S]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u],v;i;i=e[i].nxt)
if(e[i].w && !dis[v=e[i].to])
q.push(v),dis[v]=dis[u]+1;
}
return dis[T];
}
int DFS(int u,int k)
{
if(u==T || !k)
return k;
int sum=0;
for(int i=cur[u],v,f;i;i=e[i].nxt)
if(e[i].w && dis[v=e[i].to]==dis[u]+1 && (f=DFS(v,min(k,e[i].w))))
{
cur[u]=i;
e[i].w-=f,e[((i-1)^1)+1].w+=f;
k-=f,sum+=f;
}
if(!sum)
dis[u]=0;
return sum;
}
void Dinic(void)
{
int ans=0;
while(BFS())
{
memcpy(cur,head,sizeof head);
ans+=DFS(S,INF);
}
printf("%d ",ans);
}
}
namespace MiniumCost
{
static bool exist[MAXN];
static int dis[MAXN],pre[MAXN],pre_e[MAXN],flow[MAXN];
bool SPFA(void)
{
queue<int> q;
memset(exist,0,sizeof exist);
memset(dis,0x3f,sizeof dis);
memset(pre,0,sizeof pre);
memset(pre_e,0,sizeof pre_e);
memset(flow,0x3f,sizeof flow);
q.push(S),exist[S]=1,dis[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop(),exist[u]=0;
for(int i=head[u],v;i;i=e[i].nxt)
if(e[i].w && dis[v=e[i].to]>dis[u]+e[i].f)
{
dis[v]=dis[u]+e[i].f;
pre[v]=u,pre_e[v]=i;
flow[v]=min(flow[u],e[i].w);
if(!exist[v])
q.push(v),exist[v]=1;
}
}
return dis[T]^INF;
}
void MCMF(void)
{
int ans=0;
while(SPFA())
for(int i=T,t;i^S;i=pre[i])
{
e[t=pre_e[i]].w-=flow[T];
e[((t-1)^1)+1].w+=flow[T];
ans+=e[t].f*flow[T];
}
printf("%d\n",ans);
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d",&n,&m,&k);
S=1,T=n;
for(int i=1;i<=m;++i)
a[i].Init();
MaxiumFlow::Dinic();
for(int i=1;i<=m;++i)
a[i].Rebuild();
AddEdges(--S,1,k,0);
MiniumCost::MCMF();
return 0;
}

谢谢阅读。

[Luogu 2604] ZJOI2010 网络扩容的更多相关文章

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

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

  2. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)

    题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...

  3. 洛谷 P2604 [ZJOI2010]网络扩容 解题报告

    P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...

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

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

  5. ZJOI2010网络扩容

    无限orz hzwer神牛…… 第一问很简单,按数据建图,然后一遍最大流算法即可.     第二问则需要用最小费用最大流算法,主要是建图,那么可以从第一问的残留网络上继续建图,对残留网络上的每一条边建 ...

  6. BZOJ1834[ZJOI2010]网络扩容——最小费用最大流+最大流

    题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的情况下,1到N的最大流:  2.将1到N的最大流增加K所需的最小扩容费用 ...

  7. [ZJOI2010]网络扩容

    OJ题号: BZOJ1834.洛谷2604 思路: 对于第一问,直接跑一遍最大流即可. 对于第二问,将每条边分成两种情况,即将每条边拆成两个: 不需扩容,即残量大于零时,相当于这条边费用为$0$: 需 ...

  8. 1834. [ZJOI2010]网络扩容【费用流】

    Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的情况下,1到N的最大流:  2.将1到N的最大流增加K所需 ...

  9. [洛谷P2604][ZJOI2010]网络扩容

    题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...

随机推荐

  1. Python中的__future__

    在Python中,你如果在某一个版本的Python想使用未来版本中的功能,可以使用如下语法实现: from __future__ import futurename 这条语句必须放在module文件的 ...

  2. 团队协作第八周个人PSP

    11.3 --11.9本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间                结束时间 中断时间 实际用时 ...

  3. coding.net 版本控制

    这是版本测试的所有内容,其中用到了  git 和coding的远程连接. 代码及版本控制 git地址:https://git.coding.net/tianjiping/11111.git

  4. PHP 签到,与时间获取,数组长度获取

    本文实例讲述了php实现签到功能的方法.分享给大家供大家参考,具体如下:首先我在数据库里建了两张表,一个是用户的积分表,一个是签到状态表,分来用来记录用户的积分数和先到状态 在用户签到状态表中我们有一 ...

  5. lintcode-142-O(1)时间检测2的幂次

    142-O(1)时间检测2的幂次 用 O(1) 时间检测整数 n 是否是 2 的幂次. 样例 n=4,返回 true; n=5,返回 false. 挑战 O(1) time 标签 比特位操作 思路 使 ...

  6. <Effective C++>读书摘要--Inheritance and Object-Oriented Design<二>

    <Item 36> Never redefine an inherited non-virtual function 1.如下代码通过不同指针调用同一个对象的同一个函数会产生不同的行为Th ...

  7. OSG学习:自动对齐节点示例

    /********************************************************** *Write by FlySky *zzuxp@163.com http://w ...

  8. C#之WCF入门1—简单的wcf例子

    第一步:创建一个空的解决方案,新建一个WCF服务应用程序项目(使用默认名字) 来模拟服务端,新建一个控制台应用程序项目(名称改为 ConsoleApp)来模拟客户端. 第二步:简单分析WcfServi ...

  9. Jenkins系列-Jenkins忘记密码的修复方法

    找回 admin 用户的密码后,可以登录系统修改其他用户的密码. 1. Jenkins 目录结构 Jenkins 没有使用数据库,所有的信息都保存在 JENKINS_HOME 目录下的文件中.其中 J ...

  10. go的IO函数,整理下最基本的IO处理函数,工欲善其事必先利其器

    bufio.NewScanner()函数是一行一行地读,但是对/proc/函数,这里不是个好方法,最好是把所有的数据一次读完,然后再去读,有没有这样读的接口呢?把所有数据都读入到内存中然后再通过通过搜 ...