[ZJOI2010]网络扩容[网络流24题]

[ZJOI2010]网络扩容[网络流24题]

题意:

给定一张有向图,每条边都有一个容量 c 和一个扩容费用 w。这里扩容费用是指将容量扩大 1 所需的费用。求:

  1. 在不扩容的情况下,1 到 n 的最大流;

  2. 将 1 到 n 的最大流增加 k 所需的最小扩容费用

题解:

第一问好说就是跑最大流,关键是第二问怎么想
两个方法:
其实本质也是一个,我们可以将扩容的费用转化为增加一点流量,花费W的费用,因为我们要让费用尽可能低,所以问题就成了最小费用流的模型
如何建图呢?
我们可以在第一问的基础上继续建图,也可以重新建图(个人倾向第一种)
如果是第一种,我们在跑完最大流后,利用残余网络继续建图,(第一问建图中每条弧的费用都是0的),我们再在第i条弧的两端之间建一条弧,弧的容量为INF,费用是cost[i],这样保证费用是最低的
但是题目要求是增加k,怎么能控制这个量呢?我们只需要在建立一个超级源点或者超级汇点(建立一个即可),连接S(T),容量为K,费用为0,也就是我们限制流入量或者流出量最多为K即可

代码:

调了半天,终于写出来了。。。。
注意cnt要从1开始
因为0和1是一对相反边,2和3是一对。。。

#include<bits/stdc++.h>
#define inf 0x3f3f3f
#define mem(x,a) memset(x,a,sizeof(x))
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int n,m,k;
int S,T,cnt=1;
const int maxn=1e6+9;
struct node{int u,v,w,cost,next;
}edge[maxn];
int head[maxn],dis[maxn],uu[maxn],vv[maxn],ww[maxn];inline void add_edge(int u,int v,int w,int dis)
{edge[++cnt].next=head[u];edge[cnt].u=u;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].cost=dis;head[u]=cnt;
}
void add(int u,int v,int w,int dis)
{add_edge(u,v,w,dis);add_edge(v,u,0,-dis);
}
int level[maxn];
bool makelevel(int s,int t)
{queue<int>q;q.push(s);mem(level,0);level[s]=1;while(!q.empty()){int u=q.front();q.pop();
//		if(u==t)return 1;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;int w=edge[i].w;if(level[v]==0&&w!=0){level[v]=level[u]+1;q.push(v);}}}return level[t];
//	return level[t];
}
int dfs(int u,int flow,int t)
{if(u==t)return flow;int sum=0;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;int w=edge[i].w;if(level[v]==level[u]+1&&w!=0){int tmp=dfs(v,min(flow-sum,w),t);edge[i].w-=tmp;edge[i^1].w+=tmp;sum+=tmp;if(sum==flow)return sum;}}return sum;
}
int dinic()
{int ans=0;while(makelevel(S,T)){ans+=dfs(S,inf,T);}return ans;
}
int fa[maxn],vis[maxn],xb[maxn],flow[maxn];
inline bool spfa(int s,int t)
{memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));queue<int> q;while(!q.empty())q.pop();mem(fa,-1);vis[s]=1;dis[s]=0;fa[s]=0;flow[s]=inf;q.push(s);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;if(edge[i].w>0&&dis[v]>dis[u]+edge[i].cost){dis[v]=dis[u]+edge[i].cost;fa[v]=u;xb[v]=i;flow[v]=min(flow[u],edge[i].w);if(!vis[v]){vis[v]=1,q.push(v);}}}}return fa[t]!=-1;
}
inline int mcmf(int s,int t)
{int sum=0;while(spfa(s,t)){int k=t;while(k!=s){edge[xb[k]].w-=flow[t];edge[xb[k]^1].w+=flow[t];k=fa[k];}
//        tot+=flow[t];sum+=flow[t]*dis[t];}return sum;
}
int main()
{cin>>n>>m>>k;S=1;T=n;for(int i=1;i<=m;i++){int u,v,w;cin>>uu[i]>>vv[i]>>ww[i]>>dis[i];add(uu[i],vv[i],ww[i],0);}
//	add(S,1,inf,0);
//	add(n,T,inf,0);cout<<dinic()<<" ";for(int i=1;i<=m;i++){add(uu[i],vv[i],inf,dis[i]);}add(0,1,k,0);cout<<mcmf(0,n);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断整除(opj)(动态规划)

解析 与取模结合的动归&#xff0c;正常做即可 问题 眼瞎&#xff01;&#xff01;&#xff01; 这个序列的每个数都必须用到&#xff01;&#xff01;&#xff01; if(f[i-1][j]) f[i][j]1;上面这行就是不对的&#xff01;&#xff01;&#xff01; 头疼 仔细审题 opj的题…

[CF850F] Rainbow Balls

题目链接 题目描述 给定 nnn 种颜色的球&#xff0c;每种球有 aia_iai​ 个&#xff0c;对这些球执行以下操作&#xff1a; 有顺序地任意取两个球&#xff0c;将第二个球涂上第一个球的颜色&#xff0c;重复该操作至所有球颜色相同。 求期望操作次数&#xff0c;对 109710^9…

[USACO09FEB]Revamping Trails G

题意&#xff1a; 约翰一共有 N 个牧场.由 MM 条布满尘埃的小径连接。小径可以双向通行。每天早上约翰从牧场 1 出发到牧场 N 去给奶牛检查身体。 通过每条小径都需要消耗一定的时间。约翰打算升级其中 K 条小径&#xff0c;使之成为高速公路。在高速公路上的通行几乎是瞬间完…

NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

本篇内容属于非实用性&#xff08;拿来即用&#xff09;介绍&#xff0c;如对框架设计没兴趣的朋友&#xff0c;请略过。 快一个月没有写博文了&#xff0c;最近忙着两件事;一&#xff1a;阅读刘墉先生的《说话的魅力》&#xff0c;以一种微妙的&#xff0c;你我大家都会经常遇…

AT4353-[ARC101D]Robots and Exits【LIS】

正题 题目链接:https://www.luogu.com.cn/problem/AT4353 题目大意 数轴上有nnn个球mmm个洞&#xff0c;每次可以将所有球左移或者右移&#xff0c;球到洞的位置会掉下去。 求有多少让球掉进不同洞的方案。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 设一个球距离…

花店橱窗布置(洛谷P1854)(动态规划)

传送门 文章目录解析问题代码解析 一道很正常的动态规划 dp[i][j]表示到第j个花瓶放了第j朵花的dp最优值 注意&#xff1a;是严格使第i朵放在j瓶 找到最优解递归输出即可 问题 又是初始化的问题&#xff01;&#xff01;&#xff01; 一开始把dp赋值成负无穷时落掉了j0的一行…

P4009 汽车加油行驶问题

题目描述&#xff1a; 题解&#xff1a; 看了很多题解&#xff0c;无论什么解法都绕不开分层图 在本题中加满油的车每次可以移动K步&#xff0c;那么我们就可以建立一个K1层的分层图&#xff0c;表示汽车油量k的状态&#xff08;油量0…k&#xff09;&#xff0c;然后根据题目…

P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/P7294 题目大意 nmn\times mnm的网格&#xff0c;当你在(x,y)(x,y)(x,y)时你有两种选择 花费x2x^2x2的代价向右移动花费cyc_ycy​的代价向下移动 qqq次询问(1,1)(1,1)(1,1)走到(x,y)(x,y)(x,y)的最小代价。 1≤n≤109,1≤m,q…

.net core i上 K8S(五).netcore程序的hostip模式

正文上一章讲了pod的管理&#xff0c;今天再分享一个pod的访问方式1.Pod的HostIP模式Pod的HostIP模式&#xff0c;可以通过宿主机访问pod内的服务&#xff0c;创建yaml文件如下apiVersion: v1 kind: Pod metadata: name: netcore-podlabels:app: netcorepod spec:containers: …

状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)

解析 很裸的状压dp 但是直接暴力的话状态2n,枚举2n 乘在一起会T诶 怎么办呢&#xff1f; 使用下面这个循环&#xff0c;就可以保证只会枚举当前状态s的子集 for(int i(s-1)&s;i;i(i-1)&s){........ }证明 举举例子就挺明显了 为什么不重不漏呢&#xff1f; 首先i肯…

P7295-[USACO21JAN]Paint by Letters P【平面图欧拉公式】

正题 题目链接:https://www.luogu.com.cn/problem/P7295 题目大意 给出n∗mn*mn∗m的网格&#xff0c;每个格子上有字母&#xff0c;相同字母的四联通相邻格子为连通&#xff0c;每次询问一个子矩阵求连通块个数。 1≤n,m,q≤10001\leq n,m,q\leq 10001≤n,m,q≤1000 解题思路…

【活动(深圳)】告别2018之12.22 大湾区.NET Meet 大会 ,同时有网络直播

今年的 Connect(); 主题更加聚焦开发者工具生产力、开源&#xff0c;以及无服务器&#xff08;Serverless&#xff09;云服务。Visual Studio 2019 AI 智能加持的 IntelliCode、实时代码协作共享 Live Share&#xff0c;.NET Core 3.0的预览版本附带了大量更新&#xff0c;旨在…

带花树算法

对于一般的二分图匹配我们肯定会想到匈牙利算法&#xff0c;但是如果图中出现奇环怎么办&#xff1f;此时匈牙利算法就不可以了&#xff0c;就需要另一个算法&#xff1a;带花树算法 主要就是为了解决奇环的问题 我们匹配时会发现&#xff0c;如果存在奇环&#xff0c;传统的匈…

最短路径(状压dp)(ybtoj)

解析 “bug总有de完的一天” 头疼 暴力写的话本题显然复杂度是假的 有一个很好的思路优化时间复杂度 先用dp[k][i]表示**从第k个关键点到任意i点的最短路 跑k遍 SPFA或迪杰斯特拉 即可 然后转移时可以只考虑关键点 使状态转移数大大降低 细节 头真疼 边界条件&#xff1a; …

P3352-[ZJOI2016]线段树【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3352 题目大意 nnn个数字的一个序列&#xff0c;每次随机选择一个区间让这个区间所有数等于这个区间的最大值&#xff0c;重复qqq次&#xff0c;对每个位置求所有情况下这个位置的值的和。 1≤n,q≤4001\leq n,q\leq 4001≤n…

P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

文章目录题目描述解析代码洛谷传送门题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个图非常稀疏 所以我们可以只连有宝藏的点 然而这样边数会被一行横门这样的数据…

Xamarin.Forms之UserDialogs 重制版本

在 forms 里面&#xff0c;目前使用比较多的弹出组件是 Acr.UserDialogs &#xff0c;但是这个组件有些小问题&#xff0c;比如 loading .hide 会同时把 toast 给一起关掉&#xff0c;android 下的 toast 希望是 安卓原生的toast 样子&#xff0c;而不是 底部弹出一个横条&…

H.Minimum-cost Flow

H.Minimum-cost Flow 题目&#xff1a; 其实就是给出每条边的单位费用&#xff0c;q次查询&#xff0c;每次查询改变所有边的容量&#xff08;所有边容量一样&#xff09;&#xff0c;问最后流出1流量的最小花费是多少&#xff1f; 题解&#xff1a; 暴力做法肯定是每次询问…

P6177-Count on a tree II/[模板]树分块

正题 题目链接:https://www.luogu.com.cn/problem/P6177 题目大意 nnn个点的一棵树mmm次询问树上颜色。 强制在线 1≤n≤4105,1≤m≤105,0≤vali<2311\leq n\leq 4\times 10^5,1\leq m\leq 10^5,0\leq val_i<2^{31}1≤n≤4105,1≤m≤105,0≤vali​<231 解题思路 把所…

eShopOnContainers 看微服务③:Identity Service

引言通常&#xff0c;服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问。那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠。在微服务场景中&#xff0c;身份认证通常统一处理。一般有两种实现形式&#xff1a;基于API 网关中心化认证&#…