【问题描述】

新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。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 公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 – 投入成本之和)

【输入文件】

输入文件中第一行有两个正整数N 和M 。 第二行中有N 个整数描述每一个通讯中转站的建立成本,依次为P1, P2, …, PN 。 以下M 行,第(i + 2)行的三个数Ai, Bi 和Ci 描述第i 个用户群的信息。 所有变量的含义可以参见题目描述。

【输出文件】

你的程序只要向输出文件输出一个整数,表示公司可以得到的最大净获利。

【分析】

一道经典的最大权闭合图,建图方式为:

1、中转站i连一条有向边到汇点t,流量为Pi。

2、源点s连一条有向边到用户群j,流量为Cj。

3、用户群j连一条有向边到中转站i(如果用户会使用这个中转站),流量为INF。

Dinic最大流。

注:如果不知道什么是最大权闭合图请参考2007胡伯涛的论文

 #include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
const int maxn=;
const int INF=*;
using namespace std;
struct Edge
{
int u,v,c,f;
};
vector<Edge>edges;
vector<int>G[maxn];//代表结点i的第j条边在e数组中的序号。
int n,m,bian=;//bian用来统计边的数目
int dist[maxn],cur[maxn]; void AddEdge(int u,int v,int c);//加边
void init();//读入数据
void Dinic();
bool BFS();//构建层次网络
int DFS(int u,int low); int main()
{ init();
Dinic();
return ;
}
void init()
{
int i;
scanf("%d%d",&n,&m);
for (i=;i<=n;i++)
{
int w;
scanf("%d",&w);
//连汇点负权
AddEdge(i+m,n+m+,w);
}
for (i=;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
AddEdge(,i,c);//源点正权
AddEdge(i,a+m,INF);
AddEdge(i,b+m,INF);
}
}
void Dinic()
{
int flow=,temp=,i,f; while ( BFS ())
{
memset(cur,,sizeof(cur));
if (f=DFS(,INF))
flow+=f;
}
for (i=;i<G[].size();i++)
temp+=edges[G[][i]].c; printf("%d\n",temp-flow);//正权和-最小割
return;
}
bool BFS()//构建层次网络
{
queue<int>Q;
memset(dist,-,sizeof(dist));
dist[]=;
Q.push();
while ( !Q.empty() )
{
int u=Q.front();Q.pop();
for (int i=;i<G[u].size();i++)
{
Edge &temp=edges[G[u][i]];
if (dist[temp.v]==- && temp.c>temp.f)
{
dist[temp.v]=dist[u]+;
Q.push(temp.v);
}
}
}
//汇点已标号
return (dist[n+m+]!=-);
}
int DFS(int u,int low)
{
if (u==(n+m+) || low==) return low;
int flow=,f;
for (int& i=cur[u];i<G[u].size();i++)
{
Edge &temp=edges[G[u][i]];
if (temp.c>temp.f && dist[temp.v]==dist[u]+)
{
if (f=DFS(temp.v,min(low,temp.c-temp.f)))
{
temp.f+=f;
edges[G[u][i]^].f-=f;
flow+=f;
low-=f;
if (low==) break;
}
}
}
return flow;
}
//加边
void AddEdge(int u,int v,int c)
{
edges.push_back((Edge){u,v,c,});
edges.push_back((Edge){v,u,,});
bian=edges.size();
G[u].push_back(bian-);
G[v].push_back(bian-);
}

【NOI2006】最大获利的更多相关文章

  1. [NOI2006] 最大获利

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  2. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  3. BZOJ 1497: [NOI2006]最大获利 最小割

    1497: [NOI2006]最大获利 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1497 Description 新的技术正冲击着手 ...

  4. 网络流(最大流):COGS 28 [NOI2006] 最大获利

    28. [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比 时间限制:2 s   内存限制:512 MB [问题描述] 新的技术 ...

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

    下午到周六早上是期末考试...但是我还是坚守在机房....要挂的节奏啊.... 这道题就是网络流 , 建图后就最大流跑啊跑啊跑... --------------------------------- ...

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

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机 ...

  7. P4174 [NOI2006]最大获利(网络流)

    P4174 [NOI2006]最大获利 还是最大权闭合子图的题 对于每个中转站$k$:$link(k,T,P_k)$ 对于每个用户$i$.中转站$A_i,B_i$.贡献$C_i$ $link(S,i, ...

  8. 洛谷 P4174 [NOI2006]最大获利 解题报告

    P4174 [NOI2006]最大获利 题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要 ...

  9. BZOJ 1497 [NOI2006]最大获利

    1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...

  10. 【bzoj1479】[NOI2006]最大获利

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4335  Solved: 2123[Submit][Status] ...

随机推荐

  1. 14.5.2.4 Locking Reads 锁定读:

    14.5.2.4 Locking Reads 锁定读: 如果你查询数据然后插入或者修改相关数据在相同的事务里, 常规的SELECT 语句不能给予足够的保护. 其他事务可以修改或者删除你刚查询相同的记录 ...

  2. DateDiff 函数,用生日获得年龄

    一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  3. SQL条件表达式

    需求:数据表中如果满足某个条件,返回表中所有数据,否则不返回数据. 语法:CASE 表达式是一种通用的条件表达式,类似于其它语言中的 if/else 语句. CASE WHEN condition T ...

  4. 动态规划——H 最少回文串

    We say a sequence of characters is a palindrome if it is the same written forwards and backwards. Fo ...

  5. [Locked] Alien Dictionary

    Alien Dictionary There is a new alien language which uses the latin alphabet. However, the order amo ...

  6. [Hibernate] 基本增删查改

    本文记录,Java 应用通过 Hibernate 对数据库 MySQL 进行基本的增删改查操作,即CRUD. 本例子的目录结构如下 hibernate.cfg.xml 存储数据库信息,如数据库类型,账 ...

  7. hadoop 2.0 详细配置教程(转载)

    转载: http://www.cnblogs.com/scotoma/archive/2012/09/18/2689902.html 作者:杨鑫奇 PS:文章有部分参考资料来自网上,并经过实践后写出, ...

  8. 另一个有趣的Captcha 网站

    今天在一个网站注册时又发现了一个有趣的Captcha形式.给你一个翻转的图片,然后让你拽下面的slide bar让它回到正常的位置,很有趣.下面是提供这个Captcha的网站. minteye – s ...

  9. (转) Unity3D中角色的动画脚本的编写(三)

    在上一篇,我们具体的讲解了有关动画的融合,也提到了有关动画状态的权重问题.那么这次,我来以一个例子的形式来向大家讲解动画的叠加,或许会涉及到多方面的知识,我力求一次讲清.好了,我们开始吧! 首先我们必 ...

  10. Adobe DreamweaverCS6安装及破解(序列号+破解补丁)

    一:安装 1) Adobe DreamweaverCS6中文版下载地址:Adobe DreamweaverCS6中文版下载 2)Adobe DreamweaverCS6安装及破解说明下载地址:Adob ...