题目描述

新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。

在前期市场调查和站址勘测之后,公司得到了一共 N 个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第 i个通讯中转站需要的成本为 PiP_iPi​ (1≤i≤N)。

另外公司调查得出了所有期望中的用户群,一共 M 个。关于第 i 个用户群的信息概括为 AiA_iAi​ , BiB_iBi​ 和 CiC_iCi​ :这些用户会使用中转站 A i 和中转站 B i 进行通讯,公司可以获益 CiC_iCi​ 。(1≤i≤M, 1≤AiA_iAi​ , BiB_iBi​ ≤N)

THU 集团的 CS&T 公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 – 投入成本之和)

输入输出格式

输入格式:

输入文件中第一行有两个正整数 N 和 M 。

第二行中有 N 个整数描述每一个通讯中转站的建立成本,依次为 P1,P2,…,PNP_1 , P_2 , …,P_NP1​,P2​,…,PN​ 。

以下 M 行,第(i + 2)行的三个数 Ai,BiA_i , B_iAi​,Bi​ 和 CiC_iCi​ 描述第 i 个用户群的信息。

所有变量的含义可以参见题目描述。

输出格式:

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

输入输出样例

输入样例#1:
复制

5 5
1 2 3 4 5
1 2 3
2 3 4
1 3 3
1 4 2
4 5 3
输出样例#1: 复制

4

说明

样例:选择建立 1、2、3 号中转站,则需要投入成本 6,获利为 10,因此得到最大收益 4。

题解:这据说是一道最大权闭合子图...

但是我根本不知道这是什么东西qwq

大概的思路是先将所有客户的贡献加起来,然后此时我们要减去的有两个东西:届不到的用户和届到的中转站

根据这类题的思路

将源点向中转站建cost的边,中转站向用户建inf的边,用户向汇点建cost的边

接着跑一遍dinic,得到的就是要减掉的数

话说当前弧优化跑的真是飞快

代码如下:

#pragma GCC optimize(3,"inline")
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 500050
#define inf 0x3f3f3f3f
using namespace std; int v[N],w[N],pos[N],nxt[N],cnt=-,deep[],cur[N];
int n,m,tmp; int addedge(int from,int to,int cost)
{
v[++cnt]=to;
w[cnt]=cost;
nxt[cnt]=pos[from];
pos[from]=cnt;
} int add(int from,int to,int cost)
{
addedge(from,to,cost);
addedge(to,from,);
} int bfs(int s,int t)
{
queue<int> q;
memset(deep,,sizeof(deep));
deep[s]=;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=pos[u];~i;i=nxt[i])
{
if(w[i]>&&(!deep[v[i]]))
{
deep[v[i]]=deep[u]+;
q.push(v[i]);
}
}
}
return deep[t]!=;
} int dfs(int s,int t,int dist)
{
if(s==t) return dist;
for(int &i=cur[s];~i;i=nxt[i])
{
if(w[i]!=&&deep[v[i]]==deep[s]+)
{
int di=dfs(v[i],t,min(dist,w[i]));
if(di>)
{
w[i]-=di;
w[i^]+=di;
return di;
}
}
}
return ;
} int dinic(int s,int t)
{
int ans=;
while(bfs(s,t))
{
for(int i=;i<=n+m+;i++)
{
cur[i]=pos[i];
}
while(int di=dfs(s,t,inf))
{
ans+=di;
}
}
return ans;
} long long anss; int main()
{
memset(nxt,-,sizeof(nxt));
memset(pos,-,sizeof(pos));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&tmp);
add(,i,tmp);
}
int to1,to2,cost;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&to1,&to2,&cost);
add(to1,i+n,inf);
add(to2,i+n,inf);
add(i+n,n+m+,cost);
anss+=cost;
}
anss-=dinic(,n+m+);
printf("%lld\n",anss);
}

100%的数据中:N≤5 000,M≤50 000,0≤CiC_iCi​ ≤100,0≤PiP_iPi​ ≤100。

洛谷P4174 [NOI2006]最大获利(最大流)的更多相关文章

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

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

  2. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  3. [洛谷P4174][NOI2006]最大获利

    题目大意:同Petya and Graph,数据范围改成$n\leqslant5\times10^3,m\leqslant5\times10^4$ 题解:同上 卡点:无 C++ Code: #incl ...

  4. P4174 [NOI2006]最大获利 (最大权闭合子图)

    P4174 [NOI2006]最大获利 (最大权闭合子图) 题目链接 题意 建\(i\)站台需要\(p_i\)的花费,当\(A_i,B_i\)都建立时获得\(C_i\)的利润,求最大的利润 思路 最大 ...

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

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

  6. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  7. NOI2006 最大获利 洛谷P4174

    洛谷题目传送门! 题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就 ...

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

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

  9. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

随机推荐

  1. Node.js的适用场景

    高并发.聊天.实时消息推送.服务器做前端资源压缩

  2. Cobalt strike 第二节生成报告

    0x00前言: 上一节我们说了怎么连接到服务器 0x01生成报告: 首先打开Cobalt Strike 点击Cobalt Strike -> Preferences Preferences Pe ...

  3. 【合】C#线程

    浅谈ThreadPool 线程池 地址:https://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 相关概念: 线程池可以看做容纳线程 ...

  4. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  5. NodeJs中require use get typescript及其他知识点集合

    NodeJs的Express使用 nodejs事件的监听与事件的触发 TypeScript学习笔记 深入浅出Node.js Nodejs开发Office插件 类百度文库文档上传.转换和展示功能项目开源 ...

  6. SignalR web实时同步 消息推送 广播

    源码:https://github.com/SignalR/SignalR demo:http://download.csdn.net/download/qq_21533697/9702791#com ...

  7. SVN 与Git的区别

    1:最主要的区别是Git是分布式版本控制系统,而SVN是集中式的版本控制系统.能理解这一点,区别它们就会容易很多,Git并不是目前唯一的分布式版本控制系统,比如还有Mercurial等.不过话说回来G ...

  8. tree的所有节点都勾选上或者取消勾选

    还有一个功能,就是让tree的所有节点都勾选上或者取消勾选,在api中找了一下有一个方法: check target 选中指定节点. 那我们只能是选中根节点后,实现全选. getRoot none 获 ...

  9. 阻塞和唤醒线程——LockSupport功能简介及原理浅析

    目录 1.LockSupport功能简介 1.1 使用wait,notify阻塞唤醒线程 1.2 使用LockSupport阻塞唤醒线程 2. LockSupport的其他特色 2.1 可以先唤醒线程 ...

  10. Library not found for -lAPOpenSdk

    多人开发合作的时候 总是会遇见各种各样的问题 今天就来讲一个关于友盟的问题 在我的小伙伴 用cocoapods 中添加了这样一句话 pod ‘UMengSocialCOM’,  并且pod updat ...