NOI2006 最大获利(网络流)

题目描述:

新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。 在前期市场调查和站址勘测之后, 公司得到了一共 N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第 i个通讯中转站需要的成本为Pi(1≤i≤N) 。 另外公司调查得出了所有期望中的用户群,一共
M 个。关于第i个用户群的信息概括为Ai, Bi 和Ci:这些用户会使用中转站 Ai和中转站 Bi进行通讯,公司可以获益Ci。 (1≤i≤M, 1≤Ai, Bi≤N) THU 集团的CS&T公司可以有选择的建立一些中转站(投入成本) ,为一些用户提供服务并获得收益(获益之和) 。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 – 投入成本之和)

思路:经典的网络流模型,建立模型的时候可以参考二分图模型的建立。把中转站视作x部,用户群视作y部,用户群需要的中转站之间连一条有向边(用户群向中转站),容量为无穷大。虚拟一个源点,向x部每个点连一条有向边,容量为中转站的成本。再虚拟一个汇点,y部每个点向汇点连一条有向边,权值为用户群的获利。求得该图的最小割。用用户群获利的和减去最小割就是要求的最大获利,为什么呢?我们求得的最小割是没有用到的用户群的获利加上用到的中转站的成本(画个图理解理解吧),然后总利润减去最小割就是最大获利了。

#include<cstdio>
#include<vector>
#define MAXN 60005
#define INF 999999999
#define BIG 123456789
#define Min(a,b) a<b?a:b
using namespace std;
struct T
{
	int v;
	int w;
	int op;//保存反向边编号
	T(){}
	T(int a,int b,int c)
	{
		v = a;
		w = b;
		op = c;
	}
};
vector<T> g[MAXN];//残留网络
int d[MAXN];//距离标号
int vd[MAXN];//标号为i的节点个数
int m,n,flow,sum,N;//N:顶点数,flow:最大流(本题实则是最小割),sum:所有利润和

int aug(int i,int augco)//顶点i,augco:从i为起点的最大增广容量
{
	int j,augc = augco,mind = N-1,delta;
	if(i == N) return augco;//到达汇点

	for(j = 0; j < g[i].size(); j++)//枚举i的邻接点
	{
		int v = g[i][j].v;
		int w = g[i][j].w;
		if(w)//如果有边到j,最先忘写这句了,结果疯狂TLE
		{
			if(d[i] == d[v]+1)//(i,j)为可进入弧
			{
				delta = Min(augc,w);//求出经(i,j)的可增广最大值
				delta = aug(v,delta);//递归增广,返回沿(i,j)的实际增广量
				g[i][j].w -= delta;//更新残留网络
				g[v][g[i][j].op].w += delta;
				augc -= delta; //augc记录剩下的需要增广的量
				if(d[1] >= N) return augco - augc;//结束,向上一层返回经过i的实际增广量
				if(augc == 0) break; //已经到达可增广上界,提前跳出
			}
			mind = Min(mind,d[v]);//更新最小的邻接点标号
		}
	}
	if(augco == augc)//如果从i点无法增广
	{
		vd[d[i]]--;//标号为d[i]的结点数-1
		if(vd[d[i]] == 0) d[1] = N;//GAP优化
		d[i] = mind+1; //更新标号
		vd[d[i]]++;//新标号的结点数+1
	}
	return augco - augc;//向上一层返回经过i的实际增广量
}
void sap()
{
	vd[0] = N;
	while(d[1] < N-1)
		flow += aug(1,BIG);
}

int main()
{
	int a,b,c;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d",&a);
		g[1].push_back(T(i+1,a,g[i+1].size()));
		g[i+1].push_back(T(1,0,g[i].size()-1));
	}
	for(int i = n+2; i <= n+1+m; i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		g[a+1].push_back(T(i,INF,g[i].size()));
		g[i].push_back(T(a+1,0,g[a+1].size()-1));
		g[b+1].push_back(T(i,INF,g[i].size()));
		g[i].push_back(T(b+1,0,g[b+1].size()-1));
		g[i].push_back(T(m+n+2,c,g[m+n+2].size()));
		g[m+n+2].push_back(T(i,0,g[i].size()-1));
		sum += c;
	}
	N = m+n+2;
	sap();
	printf("%d\n",sum - flow);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 21:45:36

NOI2006 最大获利(网络流)的相关文章

BZOJ 1497 JZYZOJ 1344 [NOI2006]最大获利 网络流 最大权闭合图

http://www.lydsy.com/JudgeOnline/problem.php?id=1497 http://172.20.6.3/Problem_Show.asp?id=1344 思路:(最大权闭合图的思路相同) 将所有的用户群获利(正值)作为一个点连一条权值为获利值的边到st点,将所有的建站消耗(输入的是正值但是是在获利中减去的所以实质还是负值)作为一个点连一条权值为消耗值的边到ed点,再将每个用户群点和其依赖的建站点连一条权值为无穷的边,求st到ed的最大流. 此时,所求的最大获

bzoj 1497: [NOI2006]最大获利

1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5499  Solved: 2671[Submit][Status][Discuss] Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得

BZOJ 1497: [NOI2006]最大获利( 最大流 )

下午到周六早上是期末考试...但是我还是坚守在机房....要挂的节奏啊.... 这道题就是网络流 , 建图后就最大流跑啊跑啊跑... ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i ,

bzoj1497: [NOI2006]最大获利&amp;&amp;3996: [TJOI2015]线性代数

给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. Output 输出最大的D Sample Input 3 1 2 1 3 1 0 1 2 3 2 3 7 Sample Output 2 化简一下式子, 给出一个N*N的矩阵B和一个

最大权闭合图 &amp;&amp; 【BZOJ】1497: [NOI2006]最大获利

最大权闭合图详细请看胡伯涛论文<最小割模型在信息学竞赛中的应用>,我在这里截图它的定义以及一些东西. 假设我们有一个图,点集的出边都是连到点集的,那么称这个为闭合图.现在这些点集都有个权值,我们要选择某个闭合图使得权值最大. 回到此题: 最大获利这一题,我们可以这样看,用户群和中转站为带权的点集,用户群的权为收益,中转站的权为负的成本,即0-成本,用户群向其中两个中转站连弧,那么这个就是一个闭合图. 我们要求这个闭合图的权值和最大,即最大收益,那么就能转移到上面的求最大权闭合图的做法去了. 做

1497: [NOI2006]最大获利(最大权闭合子图)

1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5503  Solved: 2673 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这

【bzoj1479】[NOI2006]最大获利

1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4335  Solved: 2123[Submit][Status][Discuss] Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得

bzoj 1497: [NOI2006]最大获利 -- 最小割

1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要

BZOJ1497 [NOI2006]最大获利

Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是 机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研 究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的 地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N).