【问题描述】

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

    转载文章:php遗落的宝石 Rafael Dohms 上面的篇文章 让我惊艳了下,忍不住就翻译了下来,同时补充了部分内容. SPL,PHP 标准库(Standard PHP Library) ,此从 ...

  2. macbookpro2011 光驱坏了如何安装windows7

    由于光驱坏了试了网络上的很多方法,2011年款是无法识别到光驱的,即使做了USB的windows驱动盘也无济于事,结果去了电脑城,一位技术员最终用一个U盘装着windowsPE,从PE中安装windo ...

  3. 【POJ】3283 Card Hands

    字典树. #include <iostream> #include <cstdio> #include <cstring> #include <string& ...

  4. 【转】 Android开发之EditText属性详解

    原文网址:http://blog.csdn.net/qq435757399/article/details/7947862 1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: ...

  5. Reward(拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意: 老板要给n个员工发工资最低工资是888: 但是工人们是有要求的 如果输入 a b 表示a的工资要比 ...

  6. poj 3304 找一条直线穿过所有线段

    题目链接:http://poj.org/problem?id=3304 #include<cstdio> #include<cstring> #include<cmath ...

  7. 终止imp/exp和expdp/impdp进程运行的方法

    一.停止EXP/IMP优化速度 可以直接KILL 进程,但先要KILL 父进程,然后KILL子进程,只KILL子进程,EXP/IMP还会在后台执行的 样例:ps -ef |grep imp 查询到pi ...

  8. 另一个有趣的Captcha 网站

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

  9. floyd+动态规划 hdu-4571-Travel in time

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4571 题目大意: 有n个景点,每个点都有个游玩时间ci,游玩后得到的满意度si.给一个起点s和终点e ...

  10. phpcms如何嵌套循环

    PHPCMS V9的标签制作以灵活见长,可以自由DIY出个性的数据调用,对于制作有风格有创意的网站模板很好用,今天就介绍一个标签循环嵌套方法,可以实现对PC标签循环调用,代码如下: 在此文件里/php ...