hdu 3879(最小割模型求解最大权闭合图)

原创 2016年05月30日 21:01:28

题意:

公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。
 
•另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N)

•THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和)


解题思路:这道题是《最小割模型在信息学竞赛中的应用》介绍到的“最大获利问题”,详细的证明过程要参看论文。这里只讲建图的思路。

把每个用户和每个站点看成是一个顶点,建立网络,从源点s向每个用户连一条容量为利润的边,每个用户向相关站点连一条容量为无穷大的边,每个站点向汇点连一条容量为成本的边。求出的最小割就是maxflow = (未被选的用户收益之和+被选的站点成本之和),设sum为总收益,我们要求的是(被选的用户收益之和-被选的站点成本之和),刚好等于sum-maxflow。至于原因参看论文。

这里要使用非递归版本的dinic,我的是递归版本的超时了。

TLE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int maxn = 60000;
const int inf = 0x3f3f3f3f;
struct Edge
{
	int to,next,flow;
}edge[maxn<<2];
int n,m,cnt,pre[maxn],layer[maxn];

void addedge(int u,int v,int flow)
{
	edge[cnt].to = v;
	edge[cnt].flow = flow;
	edge[cnt].next = pre[u];
	pre[u] = cnt++;
	swap(u,v);
	edge[cnt].to = v;
	edge[cnt].flow = 0;
	edge[cnt].next = pre[u];
	pre[u] = cnt++;
}

bool bfs(int s,int t)
{
	queue<int> q;
	memset(layer,0,sizeof(layer));
	layer[s] = 0;
	q.push(s);
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		if(u == t) return true;
		for(int i = pre[u]; i != -1; i = edge[i].next)
		{
			int v = edge[i].to;
			if(edge[i].flow > 0 && layer[v] == 0)
			{
				layer[v] = layer[u] + 1;
				q.push(v);
			}
		}
	}
	return false;
}

int dfs(int u,int t,int maxflow)
{
	if(u == t) return maxflow;
	int uflow = 0;
	for(int i = pre[u]; i != -1; i = edge[i].next)
	{
		int v = edge[i].to;
		if(layer[v] == layer[u] + 1 && edge[i].flow > 0)
		{
			int flow = min(maxflow - uflow,edge[i].flow);
			flow = dfs(v,t,flow);
			edge[i].flow -= flow;
			edge[i^1].flow += flow;
			uflow += flow;
			if(uflow == maxflow) break;
		}
	}
	if(uflow == 0)
		layer[u] = 0;
	return uflow;
}

int dinic(int s,int t)
{
	int maxflow = 0;
	while(bfs(s,t) == true)
		maxflow += dfs(s,t,inf);
	return maxflow;
}

int main()
{
	int s,t,u,v,w;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		s = 0, t = n + m + 1;
		cnt = 0;
		memset(pre,-1,sizeof(pre));
		for(int i = 1; i <= n; i++)
		{
			scanf("%d",&w);
			addedge(i,t,w);
		}
		int sum = 0;
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d%d",&u,&v,&w);
			sum += w;
			addedge(s,n+i,w);
			addedge(n+i,u,inf);
			addedge(n+i,v,inf);
		}
		printf("%d\n",sum - dinic(s,t));
	}
	return 0;
}


bzoj1497: [NOI2006]最大获利(最大权闭合子图,最小割)

题目链接 1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 4307  Solved: 2108 [Su...
  • fouzhe
  • fouzhe
  • 2016年09月22日 11:18
  • 261

HDU 3879 Base Station 最小割模型 最大权闭合图

题意:有n个可选信息站要建立,每个信息站建立需要一定的代价,有m个反馈说某两个站之间建立联系的话会有一定收益。现要求最大收益。 模型: 最大权闭合图。 建图: 若(u,v)建立...
  • CHCXCHC
  • CHCXCHC
  • 2014年12月04日 14:03
  • 415

HDU 3879 最大权闭合图

Base Station Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65768/32768 K (Java/Others) T...
  • zcw1993912
  • zcw1993912
  • 2014年08月24日 23:08
  • 289

hdu 3879 (最大权闭合图)

题意:金典的最大获利问题,通信公司可以在n个地方建立信号站,每个信号站的建立要一定的费用,有m个要求,每个要求是如果两个地方都建立了信号站就会获利,求出公司的最大获利。 建图:获利边的选择要依赖点。...
  • aixiaoling1314
  • aixiaoling1314
  • 2013年08月18日 22:01
  • 567

HDU 5772 (最大权闭合图 最小割)

题目链接:点击这里题意: 给出一个序列, 问子序列的最大收益. 收益=价值-花费, 花费是子序列里面某个数字的个数的函数, 收益是任意两个下标对应的函数.题解建模: 首先将点分为3类第一类:Pij ...
  • morejarphone
  • morejarphone
  • 2016年07月30日 01:21
  • 621

hdu 3879 最大权闭合图(裸题)

/* 裸的最大权闭合图 解:参见胡波涛的《最小割模型在信息学竞赛中的应用》 */ #include #include #include #include using namespace std; #d...
  • u011483306
  • u011483306
  • 2014年11月06日 16:43
  • 514

HDU 3917 Road constructions 最小割模型最大权闭合图

这题真的坑。。。题意晦涩难懂。出题人你真是够了 题意:有n个城市需要建设道路,有m个公司可以工作。每个公司在开始工作前需要给政府税收,一个公司如果工作了一定必须完成它所负责的那些路段。所花的费用由政...
  • CHCXCHC
  • CHCXCHC
  • 2014年12月04日 12:47
  • 449

hdoj 3879 Base Station 【最小割 之 最大权闭合图】

Base Station Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65768/32768 K (Java/Others) Tot...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年09月03日 16:11
  • 228

hdu 3879 最小割模型

Base Station Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65768/32768 K (Java/Others) T...
  • HTT_H
  • HTT_H
  • 2015年03月23日 22:19
  • 266

HDU 3879 Base Station(最小割---最大权闭合)

题目地址:HDU 3879 无语。。。对这题的数据范围无语。。刚上来一看,建图思路很快出来了,但是一看数据范围。。需要5w个点。。于是我以为需要缩点或是别的优化。。于是又想了会怎么优化,感觉没法优化...
  • u013013910
  • u013013910
  • 2014年09月02日 16:59
  • 830
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 3879(最小割模型求解最大权闭合图)
举报原因:
原因补充:

(最多只允许输入30个字)