[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. HDU 4300 Clairewd’s message (next函数的应用)

    题意:给你一个明文对密文的字母表,在给你一段截获信息,截获信息前半段是密文,后半段是明文,但不清楚它们的分界点在哪里,密文一定是完整的,明文可能是残缺的,求完整的信息串(即完整的密文+明文串). 题解 ...

  2. mysql唯一查询

    MySQL单一字段唯一其他字段差异性忽略查询.在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返 ...

  3. JavaScript初探系列之数组的基本操作

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只 ...

  4. (一)Model的产生及处理

    MVC的概念其实最早可以追溯到很久很久以前,并不是WEB开发过程中所首创, 但是,MVC也适合WEB上的开发,并真正的在WEB开发领域广泛应用.MVC的第一个字母M是Model,承载着View层和Co ...

  5. Java内存区域划分和GC机制

    Java 内存区域和GC机制   目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Ga ...

  6. concurrenthashmap jdk1.8

    参考:https://www.jianshu.com/p/c0642afe03e0 CAS的思想很简单:三个参数,一个当前内存值V.旧的预期值A.即将更新的值B,当且仅当预期值A和内存值V相同时,将内 ...

  7. input 元素 相对父元素错位

    <div class="recommend"> <i class="iconfont icon-user"></i> < ...

  8. 第64天:CSS常用命名规范,有用!

    CSS常用命名,必须记住 一.常用命名 标题:title 摘要:summary 箭头:arrow 商标:label 网站标志:logo 转角/圆角:corner 横幅广告:banner 子菜单:sub ...

  9. BZOJ 1789 Y形项链(思维)

    这题类似于1787,最后的节点一定是两点的LCA,这里也就是两个字符串的最长公共前缀. # include <cstdio> # include <cstring> # inc ...

  10. hdu5575 Discover Water Tank

    题意: 给出个水箱,水箱两侧有无限高的隔板,水箱内有整数高度的隔板将水箱分成n-1份,现在给出m个限制,每个限制表示某个位置的某个高度有水或没水,问最多能同时满足多少个限制.n,m<=2*10^ ...