【问题描述】

新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。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. Sublime Text 有哪些使用技巧

    1. 更改变量名的几种方法&lt;img src="https://pic4.zhimg.com/d93cf0e8987e0117f3a3187cfe8e53fb_b.jpg&quo ...

  2. AlgorithmsI Exercises: UnionFind

    Question1 Give the id[] array that results from the following sequence of 6 unionoperations on a set ...

  3. The Embarrassed Cryptographer(高精度取模+同余模定理)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11435   Accepted: 3040 Description The ...

  4. ural-1099-Work Scheduling(裸带花树)

    题意: 有N个人,有限对的人可以在一起工作,问最多能有多少对. 分析: 任意图的最大匹配 // File MAXName: 1099.cpp // Author: Zlbing // Created ...

  5. ♫【Underscore.js】

    Underscore.js Underscore.js 1.5.2 中文文档 Underscore 是一个JavaScript实用库,提供了类似Prototype.js (或 Ruby)的一些功能,但 ...

  6. 实战weblogic集群之安装weblogic

    一.系统及软件版本 OS版本:Red Hat Enterprise Linux Server release 6.6WebLogic Server 版本: 10.3.3.0JDK版本:1.7.0_79 ...

  7. 【模拟】Codeforces 691C Exponential notation

    题目链接: http://codeforces.com/problemset/problem/691/C 题目大意: 输入一个数,把它表示成a·10b形式(aEb).输出aEb,1<=a< ...

  8. 我的第一个wp8小程序

    一:截图,功能介绍:点击音乐红色按钮,播放铃声 二:代码 XAML代码 <phone:PhoneApplicationPage x:Class="PhoneApp1.MainPage& ...

  9. Pet

    Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He ...

  10. SRM 392(1-250pt)

    DIV1 250pt 题意:给两个各含有一个*号的字符串s1和s2,可以用一个任意字符串代替*号(注意是串,不是只能用单个字符代替,也可以为用空串代替),问能否将s1和s2变为相同的字符串.如果能输出 ...