[Luogu 2604] ZJOI2010 网络扩容
[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 网络扩容的更多相关文章
- 【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- ZJOI2010网络扩容
无限orz hzwer神牛…… 第一问很简单,按数据建图,然后一遍最大流算法即可. 第二问则需要用最小费用最大流算法,主要是建图,那么可以从第一问的残留网络上继续建图,对残留网络上的每一条边建 ...
- BZOJ1834[ZJOI2010]网络扩容——最小费用最大流+最大流
题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容费用 ...
- [ZJOI2010]网络扩容
OJ题号: BZOJ1834.洛谷2604 思路: 对于第一问,直接跑一遍最大流即可. 对于第二问,将每条边分成两种情况,即将每条边拆成两个: 不需扩容,即残量大于零时,相当于这条边费用为$0$: 需 ...
- 1834. [ZJOI2010]网络扩容【费用流】
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需 ...
- [洛谷P2604][ZJOI2010]网络扩容
题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...
随机推荐
- JS中Text节点总结
文本节点有Text类型表示,包含的是可以找字面解释的纯文本内容.纯文本中可以包含转移后的HTML字符,但不能包含HTML代码.Text节点具有以下属性: 1.nodeType的值为3. 2.nodeN ...
- 关于ES6-{块级作用域 let const 解构赋值 数组 字符串 函数的扩展 箭头函数}
关于ES6 块级作用域 任何一对花括号({})中的语句集都属于一个块,在块中声明的变量在代码块外都是不可访问的,称之为块级作用域,ES5以前没有块级作用域 let let 是ES6新增的声明变量的一种 ...
- this指针与const成员函数
this指针的类型为:classType *const // 即指向类类型非常量版本的常量指针 所以,我们不能把this绑定到一个常量对象上 ===> 不能在一个常量对象上调用普通的 ...
- 2017秋软工1 - 本周PSP
1.本周PSP 2. 本周PSP饼状图 3. 本周进度条 4. 累计进度图
- c# 调取 c++ dll____c#调用dll
1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...
- 2019寒假训练营寒假作业(三) MOOC的网络空间安全概论笔记部分
目录 第五章 网络攻防技术 5.1:网络信息收集技术--网络踩点 信息收集的必要性及内容 网络信息收集技术 网络踩点(Footprinting) 网络踩点常用手段 5.2:网络信息收集技术 --网络扫 ...
- GPS定位,根据经纬度查询附近地点的经纬度-sql方法实现
根据当前所在的坐标点也即经纬度,查找数据库中附近5公里或10公里附近的所有信息的实现,经过查找资料,原来是我高二学的,就是求弦长,数学忘完了,没想到数学还这么有用,数学啊 真是用途太大了. 用到的什么 ...
- AMH面板命令操作大全
LNMP面板 - AMH 命令使用nginx篇 » SSH Nginx1) 有步骤提示操作: ssh执行命令: amh nginx然后选择对应选项进行操作. 2) 或直接操作: 启动Nginx: am ...
- git & configs
git & configs https://alvinalexander.com/git/git-show-change-username-email-address https://stac ...
- echarts 画 canvas 如果在IE8下不显示图标
网上说法很多,可能版本问题,也有说script标签位置问题(放在body中) 不过先试已下,清除option对象中多余的逗号(,) 对象的最后一个属性后不要有逗号结尾