给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求:
1、
在不扩容的情况下,1到N的最大流;
2、 将1到N的最大流增加K所需的最小扩容费用。
求出最大流后,残余网络的流量不变,费用改为 0. 对原图的每一条边,对应增加一条流量为 k,费用为 w 的边,再增加一个源,源到 1 的流量为 k,费用为 0。求最小费用最大流,即为第二问答案。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define min(a,b) ( (a)< (b)? (a): (b) )
#define inf 0x7fffffff
int const N= 1010, M= 5010;
int n, m, k, cnt, S, T;
int dist[N][N];
struct Edge{
int flow, cost, adj;
Edge* next;
}tb[M<<2];
Edge* mat[N], *Pre[N];
inline Edge* reserve( Edge* p ){
return tb+ ( (p- tb)^ 1 );
}
inline void add( int u, int v, int c, int w ){
++cnt;
tb[cnt].adj= v; tb[cnt].flow= c; tb[cnt].cost= w;
tb[cnt].next= mat[u]; mat[u]= tb+ cnt;
++cnt;
tb[cnt].adj= u; tb[cnt].flow= 0; tb[cnt].cost= -w;
tb[cnt].next= mat[v]; mat[v]= tb+ cnt;
}
int que[M<<2], ht[N], flag[N], path[N], head, tail;
int bfs(){
que[0]= S; head= 0; tail= 0;
for( int i= 0; i<= n; ++i ) ht[i]= -1; ht[S]= 0;
while( head<= tail ){
int u= que[head++];
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== -1 && p->flow ){
ht[p->adj]= ht[u]+ 1;
que[++tail]= p->adj;
}
}
return ht[T]!= -1;
}
int dfs( int u, int flow ){
if( u== T ) return flow;
int tf= 0, f;
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== ht[u]+ 1 && p->flow && flow> tf &&
( f= dfs( p->adj, min( p->flow, flow- tf ) ) ) ){
reserve( p )->flow+= f;
p->flow-= f;
tf+= f;
}
if( tf== 0 ) ht[u]= -1;
return tf;
}
int spfa(){
for( int i= 0; i<= n; ++i ) {
ht[i]= inf; flag[i]= 0; }
que[0]= S; head= tail= 0;
path[S]= S; flag[S]= 1; ht[S]= 0;
while( head<= tail ){
int u= que[head++]; flag[u]= 0;
for( Edge* p= mat[u]; p; p= p->next )
if( p->flow && ht[u]+ p->cost< ht[p->adj] ){
ht[p->adj]= ht[u]+ p->cost;
Pre[p->adj]= p; path[p->adj]= u;
if( flag[p->adj]== 0 ){
flag[p->adj]= 1;
que[++tail]= p->adj;
}
}
}
return ht[T]!= inf;
}
int min_cost(){
int res= 0;
while( spfa() ){
int tf= inf, tmp= path[T];
while( tmp!= S ){
tf= min( Pre[tmp]->flow, tf );
tmp= path[tmp];
}
tmp= path[T];
while( tmp!= S ){
Pre[tmp]->flow-= tf;
reserve( Pre[tmp] )->flow+= tf;
tmp= path[tmp];
}
res+= ht[T]* tf;
}
return res;
}
int main(){
while( scanf("%d%d%d",&n,&m,&k)!= EOF ){
int u, v, c, w;
cnt= -1;
for( int i= 0; i<= n+ 1; ++i ) mat[i]= 0;
for( int i= 0; i<= n; ++i )
for( int j= 0; j<= n; ++j ) dist[i][j]= -1;
S= 1; T= n;
for( int i= 0; i< m; ++i ){
scanf("%d%d%d%d", &u, &v, &c, &w );
add( u, v, c, 0 );
dist[u][v]= w;
}
int ans= 0;
while( bfs() ) ans+= dfs( S, 0x7fffffff );
for( int i= 1; i<= n; ++i )
for( int j= 1; j<= n; ++j )
if( dist[i][j]!= -1 ) add( i, j, k, dist[i][j] );
S= T+ 1;
add( S, 1, k, 0 );
int res= min_cost();
printf("%d %d\n", ans, res );
}
return 0;
}
分享到:
相关推荐
本文档主要针对爱立信RNC3820的扩容技术进行详尽的阐述,旨在为技术人员提供清晰的操作指南,确保扩容过程的顺利进行,同时减少对现有网络服务的影响。 一、扩容背景与适用范围 RNC(Radio Network Controller)是...
* SAN 网络:存储区域网络(Storage Area Network),是一个专门用于存储设备之间的网络。 * TB 裸容量 SAS 磁盘:TB 代表 Terabyte,即 1TB 的存储容量;SAS 代表 Serial Attached SCSI, 是一种高性能的存储接口...
总结来说,"V3.11网络负荷监控与扩容指导书"主要涵盖了UMTS网络在高负荷情况下的监控、优化和扩容策略,为网络优化人员提供了详细的指南,帮助他们应对网络负荷增加带来的挑战,保持网络服务质量和用户体验。...
在扩容过程中,需要选择适合的存储设备和技术,例如 SAN(Storage Area Network)、NAS(Network Attached Storage)、DAS(Direct Attached Storage)等,并对存储设备的性能、可靠性、扩展性等方面进行评估。...
网络游戏的网络扩容系统是保障大型在线游戏稳定运行的关键技术之一,它涉及到服务器架构设计、网络带宽管理、负载均衡和容灾恢复等多个方面。在这个压缩包文件“网络游戏-网络的扩容系统.zip”中,主要资料为“网络...
在SAN(Storage Area Network)环境中,当已分配出去的LUN(Logical Unit Number)需要扩容时,不同存储设备厂商如IBM、EMC、Dell、HP等提供的管理界面操作方式各不相同。然而,在服务器端的操作通常大同小异。本文...
扩容过程中需注意保持数据一致性,避免服务中断,同时考虑网络和硬件的兼容性。 三、vSAN升级 软件更新是保持系统安全性和功能性的关键。《VMware vSAN 售后最佳实践 第五部:vSAN升级手册 v1.3.pdf》提供了一套...
在现代通信网络中,骨干网(Backbone Network)扮演着至关重要的角色。它作为数据传输的主要通道,连接了不同地区的网络节点,实现大规模的数据交换和服务提供。随着互联网应用的日益增多,特别是高清视频流、在线...
### Windows Server 2003 系统硬盘扩容实操指南 #### 一、概述 在Windows Server 2003环境下,系统硬盘调整与扩容是一项常见且必要的维护任务。本文将详细介绍如何通过一系列步骤来实现硬盘的扩容,并提供详细的...
南方XX省计算机互联网第四期扩容工程是一次针对现有网络基础设施的重大升级,旨在应对日益增长的用户需求和不断提升的网络服务质量。这一工程的核心目标是确保网络的稳定性和拓展性,以满足未来几年内用户对互联网接...
然而,对于某些用户来说,更倾向于使用传统的`Network Manager`,因为它提供了一种图形化的界面(尽管在服务器环境中通常是命令行版本),并且支持动态网络配置,例如DHCP,以及WIFI和移动宽带连接。`Network ...
标题中的“浪潮磁盘阵列带HBA卡的扩容后重启centos服务器进不了图形界面”涉及了几个关键的IT知识点,包括磁盘阵列、HBA卡、Linux操作系统(特别是CentOS)以及系统维护与故障排查。接下来,我们将详细讨论这些概念...
关键词:数据中心机房搬迁,扩容技术方案,电源系统,网络架构,安全措施 一、概述 当前数据中心机房面临着电源系统不稳定、空间不足、网络架构不安全、安全隐患等问题。为解决这些问题,我们提出了数据中心机房...
"Microsoft Network Monitor网络协议数据分析工具使用教程" Microsoft Network Monitor是微软推出的一个功能强大且实用的网络协议数据分析工具,该工具能够捕获和分析网络数据包,从而帮助开发者、测试人员和网络...
EMC NAS(Network Attached Storage)是一种网络存储解决方案,它提供了通过网络访问的文件共享功能。在本文档中,我们将深入探讨如何在EMC NAS设备上新建文件存储池以及如何进行扩容操作。 首先,我们来看新建文件...
"Android-NetworkState"是一个专门为Android设计的轻量级网络状态监听库,它简化了网络状态检测的过程,使开发者能够更便捷地获取和监控网络状态。下面我们将详细探讨这个库的功能、使用方法以及它如何提升Android...
本实例深入探讨了visio在智慧城市中的应用,特别是网络通信工程领域的具体实践,以“省干LTE回传PTN系统扩容工程(深圳、惠州、汕头区域)”为案例进行解析。 首先,visio信息化设计是一种强大的图表绘制工具,广泛...
单倍型网络图绘制软件NETWORK 5.0,2020年1月18日更新版本。 Network generates evolutionary trees and networks from genetic, linguistic, and other data. Network can then provide age estimates for any ...
本项目“Android29的网络状态获取工具,NetworkTools-master.zip”提供了一个专门针对Android 29及以下版本的网络状态管理工具,帮助开发者轻松解决网络连接检测和类型识别的问题。 首先,我们要了解Android 29(即...
Jx-NNT : 神经网络工具箱 * 此工具箱包含六种类型的神经网络 + Artificial neural network ( ANN ) + Feed Forward Neural Network ( FFNN ) + Cascade Forward Neural Network ( CFNN ) + Recurrent Neural ...