【题意】给定n个点,点权为pi。m条边,边权为ci。选择一个点集的收益是在[点集中的边权和]-[点集点权和],求最大获利。n<=5000,m<=50000,0<=ci,pi<=100。

【算法】最大权闭合子图 或 最小割

【题解】网络流的复杂度是假的233大胆地写吧。

把边视为连向端点的点,就是最大权闭合子图了。

重点讲一下Amber论文中的最小割模型。

设$d_v$表示点v的邻边边权和,$g$表示一端选一端不选的边权和(即点集和其他点的割),那么:

$$2ans=-(-\sum_v d_v+g+2*\sum_v p_v)$$

为了方便求最小割,我们在右边整体加了个负号,这样我们就是求括号内的最小值了。

在网络流图中,对每个点x建一个点,S-x-T,割x-T表示在S割表示选,割S-x表示在T割表示不选,所以把选点的代价$2p_v-d_v$放在x-T上。

如果点u选而点v不选,那么边(u,v)就必须加入最小割,所以从u向v连边容量为边权,这样割掉u-T和S-v后还有通路S-u-v-T。

建图完毕后,图中有负权边。我们给所有节点加一个固定代价U(U足够大,无论选不选),这样显然不影响决策,就可以在S-x和x-T上+U,从而解决负权边的问题。

(最小割不能直接给所有边加权,这样会破坏边权大小关系,必须要从建图方面考虑不影响决策的代价)

最终答案就是$\frac{U*n-c[S,T]}{2}$。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,S,T,p[];
namespace nwf{
const int maxn=,maxm=,inf=0x3f3f3f3f;
int tot=,first[maxn],d[maxn],q[maxn],cur[maxn];
struct edge{int v,f,from;}e[maxm*];
void insert(int u,int v,int f){
tot++;e[tot].v=v;e[tot].f=f;e[tot].from=first[u];first[u]=tot;
tot++;e[tot].v=u;e[tot].f=;e[tot].from=first[v];first[v]=tot;
}
bool bfs(){
memset(d,-,sizeof(d));
d[S]=;
int head=,tail=;q[head]=S;
while(head<tail){
int x=q[head++];
for(int i=first[x];i;i=e[i].from)if(e[i].f&&d[e[i].v]==-){
d[e[i].v]=d[x]+;
q[tail++]=e[i].v;
}
}
return ~d[T];
}
int dfs(int x,int a){
if(x==T||a==)return a;
int flow=,f;
for(int& i=cur[x];i;i=e[i].from)
if(e[i].f&&d[e[i].v]==d[x]+&&(f=dfs(e[i].v,min(a,e[i].f)))){
e[i].f-=f;e[i^].f+=f;
flow+=f;a-=f;
if(a==)break;
}
return flow;
}
int dinic(){
int ans=;
while(bfs()){
for(int i=S;i<=T;i++)cur[i]=first[i];
ans+=dfs(S,inf);
}
return ans;
}
}
int main(){
scanf("%d%d",&n,&m);
S=;T=n+;int U;
for(int i=;i<=n;i++){
int u;
scanf("%d",&u);
nwf::insert(i,T,u*);
}
for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
nwf::insert(u,v,w);nwf::insert(v,u,w);//
p[u]+=w;p[v]+=w;U=max(U,max(p[u],p[v]));
}
for(int i=;i<=n;i++){
nwf::insert(S,i,U);nwf::insert(i,T,U-p[i]);
}
printf("%lld",(1ll*U*n-nwf::dinic())/);
return ;
}

【BZOJ】1497: [NOI2006]最大获利 最大权闭合子图或最小割的更多相关文章

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

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

  2. BZOJ1497[NOI2006]最大获利——最大权闭合子图

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

  3. bzoj1497 [NOI2006]最大获利 最大权闭合子图

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路 最大权闭合子图的裸题 一开始知道是这个最大权闭合子图(虽然我不知道名字),但是我 ...

  4. COGS28 [NOI2006] 最大获利[最大权闭合子图]

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  5. LuoguP2762 太空飞行计划问题(最大权闭合子图,最小割)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  6. Petya and Graph/最大权闭合子图、最小割

    原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...

  7. BZOJ 1497: [NOI2006]最大获利(最大权闭合子图)

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机 ...

  8. BZOJ.1497.[NOI2006]最大获利(最小割 最大权闭合子图Dinic)

    题目链接 //裸最大权闭合子图... #include<cstdio> #include<cctype> #include<algorithm> #define g ...

  9. bzoj 1497 [NOI2006]最大获利【最大权闭合子图+最小割】

    不要被5s时限和50000点数吓倒!大胆网络流!我一个5w级别的dinic只跑了1s+! 看起来没有最大权闭合子图的特征--限制,实际上还是有的. 我们需要把中转站看成负权点,把p看成点权,把客户看成 ...

随机推荐

  1. 蜗牛慢慢爬 LeetCode 3. Longest Substring Without Repeating Characters [Difficulty: Medium]

    题目 Given a string, find the length of the longest substring without repeating characters. Examples: ...

  2. PXE推一半失败,HP服务器、曙光服务器删除数据

    一.#设备:惠普HP DL380 Gen9 PXE安装失败,系统尝试从硬盘启动 需要将安装未完整的系统数据删除,以便正常装机 从控制台重启设备 重启后,HP在此界面选择Intelligent Prov ...

  3. [Google] 看雪论坛: 安卓碎片化的情况

    2018年10月28日早间消息,谷歌方面发布了Android各版本的最新份额数据,截止到10月26日.即便是已经推出3个月了,Android 9 Pie系统的用户数仍旧没有超过0.1%,导致未出现在榜 ...

  4. 微信小程序 功能函数 地图定位相对直线距离

      GetDistance:function(lat1, lng1, lat2, lng2){ // console.log(lat1) var radLat1 = lat1 * Math.PI / ...

  5. webgl学习笔记一-绘图单点

    写在前面   WebGl(全称:Web Graphics Library : web图形库) 是基于OpenGL ES 2.0的3D绘图协议.   WebGL完美地解决了现有的Web交互式三维动画的两 ...

  6. Linux 重定向输出到多个文件中

    转自:http://codingstandards.iteye.com/blog/833695 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们 ...

  7. 九度-题目1195:最长&最短文本

    http://ac.jobdu.com/problem.php?pid=1195 题目描述: 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出 ...

  8. SQL中 ALL 和 ANY 区别的

    在select中我们可能会认为all和any应该表达的意思差不多.其实他们的意思完全不一样: all: 是将后面的内容看成一个整体,如: >all (select age from studen ...

  9. 第130天:移动端-rem布局

    一.关于布局方案 当拿到设计师给的UI设计图,前端的首要任务就是布局和样式,相信这对于大部分前端工程师来说已经不是什么难题了.移动端的布局相对PC较为简单,关键在于对不同设备的适配.之前介绍了一篇关于 ...

  10. CTSC2012-Cheat

    题意 给出一些母01串,多次询问,每次询问一个01串,问一个最大的\(L\),使得可以在询问串中选出若干个不相交的,长度大于等于\(L\)的子串,这些子串都在母串中出现过,且子串的长度和大于等于询问串 ...