【题意】给定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. 实现Spring管理struts的Action

    struts2和spring的整合,关键点在于struts2中的action要纳入spring容器的管理中成为一个bean.  可以在struts2中配置:  <struts>      ...

  2. Spark Shuffle之Hash Shuffle

    源文件放在github,如有谬误之处,欢迎指正.原文链接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/hash-sh ...

  3. 【week8】psp~~进度条

    本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 10月7日 星期一 论文 看生物信息方面的论文 10:00 12:00 5 115 写代码 注册信息从前台传入servlet 18:00 ...

  4. php自带的filter过滤函数

    PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. filter_has_var()检查是否存在指定输入类型的变量. filter_id()返回指定过滤器的 ID 号. filt ...

  5. PDO笔记

    <?php/* * 查询操作主要是PDO::query().PDO::exec().PDO::prepare().PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作, ...

  6. CODE FESTIVAL 2016 qualA Grid and Integers

    划年代久远的水 题意 有一个R*C的棋盘,要求在每个格子上填一个非负数,使得对任意一个2*2的正方形区域,左上角和右下角的数字之和等于左下角和右上角的数字之和.有一些格子已经被填上了数字,问现在能否满 ...

  7. MySQL5.7初始配置

    MySQL5.7初始配置 Windows7 环境安装MySQL5.7配置命令 <<<<<<<<<<<<<<<& ...

  8. 【BZOJ4755】扭动的回文串(Manacher,哈希)

    [BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...

  9. 【BZOJ4443】小凸玩矩阵(二分答案,二分图匹配)

    [BZOJ4443]小凸玩矩阵(二分答案,二分图匹配) 题面 BZOJ Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两 ...

  10. BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】

    题目链接 BZOJ1069 题解 首先四个点一定在凸包上 我们枚举对角线,剩下两个点分别是两侧最远的点 可以三分,复杂度\(O(n^2logn)\) 可以借鉴旋转卡壳的思想,那两个点随着对角线的一定单 ...