【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] ...
随机推荐
- phpMyAdmin <= 4.0.4.1 import.php GLOBALS变量注入漏洞
漏洞版本: phpMyAdmin <= 4.0.4.1 漏洞描述: CVE(CAN) ID: CVE-2013-4729 phpmyadmin是MySQL数据库的在线管理工具,主要功能包括在线创 ...
- 【枚举】Vijos P1012 清帝之惑之雍正
题目链接: https://vijos.org/p/1012 题目大意: 给n个坐标(n<=100 000),求直线距离最短是多少.数据较大用long long 或 double 题目思路: [ ...
- postgresql使用文档之一 初始化数据存储区
17.2. 创建一个数据库集群(Database Cluster) 在你能做任何事情之前,你必须在磁盘上初始化一块存储空间.我们称这为一个数据库集群(database cluster). 一个Data ...
- G - MPI Maelstrom
题目大意: BIT最近要取会他们的超级计算机,32处理器阿波罗奥德赛与分层通信子系统分布式共享内存的机器(听着很高端大气),瓦伦丁*麦基的顾问杰克*斯威特告诉她基准测试的新系统.(没有明白什么意思) ...
- (组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)
/* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> # ...
- JavaScript笔记(一),
加法函数 javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accA ...
- 11th day
今天MySQL数据库的基本知识就学完了,明天开始做小项目什么的,有点小激动啊... <?php // 定义$sql语句执行函数 function my_query($sql){ $result ...
- PHP学习之[第09讲]PHP 的 Mysql 数据库函数 (微型博客系统)
一.数据库函数: mysql_connect(数据库地址,用户名,密码) mysql_select_db(数据库名) mysql_set_chartset(‘编码’) //PHP5.2.3以后的函数 ...
- 命令行修复MBR分区
命令行修复MBR 1.shift+F10打开命令行 2.输入:diskpart 3.输入:list disk 查看磁盘信息 4.选择你要操作的磁盘:select disk 0 5.输入:clean,清 ...
- EF 5.0 和 EF4.0 语法区别
// 实现对数据库的添加功能,添加实现EF框架的引用 40 41 public T AddEntity(T entity) 42 43 { 44 45 //EF4.0的写法 添加实体 46 47 // ...