【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 公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 – 投入成本之和)
【输入文件】
输入文件中第一行有两个正整数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】最大获利的更多相关文章
- [NOI2006] 最大获利
[NOI2006] 最大获利 ★★★☆ 输入文件:profit.in 输出文件:profit.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] 新的技术正冲击着手 ...
- BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4375 Solved: 2142[Submit][Status] ...
- BZOJ 1497: [NOI2006]最大获利 最小割
1497: [NOI2006]最大获利 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1497 Description 新的技术正冲击着手 ...
- 网络流(最大流):COGS 28 [NOI2006] 最大获利
28. [NOI2006] 最大获利 ★★★☆ 输入文件:profit.in 输出文件:profit.out 简单对比 时间限制:2 s 内存限制:512 MB [问题描述] 新的技术 ...
- BZOJ 1497: [NOI2006]最大获利( 最大流 )
下午到周六早上是期末考试...但是我还是坚守在机房....要挂的节奏啊.... 这道题就是网络流 , 建图后就最大流跑啊跑啊跑... --------------------------------- ...
- BZOJ 1497: [NOI2006]最大获利(最大权闭合子图)
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机 ...
- P4174 [NOI2006]最大获利(网络流)
P4174 [NOI2006]最大获利 还是最大权闭合子图的题 对于每个中转站$k$:$link(k,T,P_k)$ 对于每个用户$i$.中转站$A_i,B_i$.贡献$C_i$ $link(S,i, ...
- 洛谷 P4174 [NOI2006]最大获利 解题报告
P4174 [NOI2006]最大获利 题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要 ...
- BZOJ 1497 [NOI2006]最大获利
1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...
- 【bzoj1479】[NOI2006]最大获利
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4335 Solved: 2123[Submit][Status] ...
随机推荐
- 【HDOJ】2217 Visit
挺好的一道DP. /* 2217 */ #include <iostream> #include <cstdio> #include <cstring> #incl ...
- Strange Way to Express Integers (一般模线性方程组)
Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 8476 Accepted: 2554 Description Elin ...
- 搜索(DLX): POJ 3074 3076 Sudoku
POJ 3074 : Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller ...
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...
- foxmail邮箱在代理环境下不能使用解决方法。
由于工作原因,在域环境中但是还不是域用户,怎么设置代理也不能使用邮件客户端,幸亏老大给一软件,如下图 安装超级简单,而且软件很小,安装完后重启,基本不用设置就可以使用,前提是你的邮箱客户端要设置代理服 ...
- 【Android Studio】No JVM installation found
如果没有配置好JDK的环境变量,启动Android Studio的时候会报错: 请参考我整理的博客文章<JDK的下载.安装和配置>,链接:http://www.cnblogs.com/du ...
- ovs router
- 无题II hdu 2236(二分枚举区间)
分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止. 代码: =============================================== ...
- quartz 定时任务的实现
需求:项目中有一个任务,当时间到了会向移动端通过百度云推送推送信息,之前很傻叉的是写一个多线程一直扫描,每分钟扫描一次,比对当前时间和任务时间是否一样,结果把 项目跑死了,项目中用了一个简单的quar ...
- Android获取cpu和内存信息、网址的代码
android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...