【模板】最大密度子图

ACM模板


目录

      • 概念
      • 做法
      • 例题

概念

选择一个子图G′=(V′,E′)G'=(V',E')G=(V,E),其中对于任意一条边的两个端点必须在所选的点集中,最大化∣E′∣∣V′∣\frac{|E'|}{|V'|}VE

做法

利用01分数规划二分即最大化
∣E′∣−g∣V′∣|E'|-g|V'|EgV
也就是最小化g∣V′∣−∣E′∣=∑v∈V′g−∑v∈V′1=∑v∈V′g−12(∑v∈V′dv−c[V′,V′ˉ])=12(∑v∈V′(2g−dv)+c[V′,V′ˉ])g|V'|-|E'|=\sum_{v\in V'}g-\sum_{v\in V'}1=\sum_{v\in V'}g-\frac{1}{2}(\sum_{v\in V'}d_v-c[V',\bar{V'}])=\frac 1 2(\sum_{v\in V'}(2g-d_v)+c[V',\bar{V'}])gVE=vVgvV1=vVg21(vVdvc[V,Vˉ])=21(vV(2gdv)+c[V,Vˉ])
我们发现除了割边还有一个东西即∑v∈V′(2g−dv)\sum_{v\in V'}(2g-d_v)vV(2gdv),只需要将每个点连向汇点一条容量是2g−dv2g-d_v2gdv的边即可让构建的割的容量是上述式子。因为对于V′V'V中的点要求与源点SSS放在一起,那么只要它与汇点存在边就会对割的容量由贡献。

建图:原图中的点与边的容量都是1,再加上所有点向汇点连边容量是2g−dv2g-d_v2gdv
那么构建出的网络流的割的容量c[S,T]=2(g∣V′∣−∣E′∣)c[S,T]=2(g|V'|-|E'|)c[S,T]=2(gVE)
于是g∣V′∣−∣E′∣=12c[S,T]g|V'|-|E'|=\frac{1}{2}c[S,T]gVE=21c[S,T]
即求最小割。

为了防止连向汇点的边权2g−dv2g-d_v2gdv是负值,需要增添一个偏移量UUU
重新建图即:①源点向每个点连边,容量是UUU;②原图中的边,容量是1;③每个点向汇点连边,容量是2g−dv+U2g-d_v+U2gdv+U
可证g∣V′∣−∣E′∣=12(c[S,T]−nU)g|V'|-|E'|=\frac{1}{2}(c[S,T]-nU)gVE=21(c[S,T]nU)

最初需要最大化的值即∣E′∣−g∣V′∣=nU−c[S,T]2|E'|-g|V'|=\frac{nU-c[S,T]}{2}EgV=2nUc[S,T]

不难看出如果我们这里把边看成点,选边必须选择两个端点的限制可以加到边上即边向两个端点连单向边即可以转化为最大权闭合图问题

类型建图点数建图边数
最大密度子图|V|2|V|+|E|
最大权闭合图|V|+|E||V|+3|E|

如果存在边权密度:∑e∈EWe∣V∣\frac{\sum_{e\in E} W_e}{|V|}VeEWe
dvd_vdv记为该点出边权值和而不是出度即可

若存在点权和边权密度∑v∈Vpv+∑e∈EWe∣V∣\frac{\sum_{v\in V}p_v+\sum_{e\in E} W_e}{|V|}VvVpv+eEWe
dvd_vdv记为该点出边权值和
②连向汇点和源点的边容量是2g−dv−2pv+U2g-d_v-2p_v+U2gdv2pv+U

例题

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5010,M=(50000+2*N)*2+10,INF=0x3f3f3f3f;
int n,m;
int h[N],e[M],ne[M],f[M],idx;
int S,T,d[N],q[N],cur[N];
int deg[N],p[N];
void add(int a,int b,int c1,int c2)
{e[idx]=b,ne[idx]=h[a],f[idx]=c1,h[a]=idx++;e[idx]=a,ne[idx]=h[b],f[idx]=c2,h[b]=idx++;
}
bool bfs()
{memset(d,-1,sizeof d);int tt=0,hh=0;q[S]=0,cur[S]=h[S],d[S]=0;while(hh<=tt){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(d[j]==-1&&f[i]){d[j]=d[t]+1;cur[j]=h[j];if(j==T) return 1;q[++tt]=j;}}}return 0;
}
int dfs(int u=S,int flow=INF)
{if(u==T) return flow;int rmn=flow;for(int i=cur[u];i!=-1&&rmn;i=ne[i]){cur[u]=i;int j=e[i];if(d[j]==d[u]+1&&f[i]){int t=dfs(j,min(f[i],rmn));if(!t) d[j]=-1;f[i]-=t,f[i^1]+=t,rmn-=t;}}return flow-rmn;
}
int dinic()
{int r=0;while(bfs()) r+=dfs();return r;
}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);S=0,T=n+1;for(int i=1;i<=n;i++) cin>>p[i],p[i]*=-1;while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c,c);deg[a]+=c,deg[b]+=c;//记录出边权值和}int U=0;for(int i=1;i<=n;i++) U=max(U,2*p[i]+deg[i]);for(int i=1;i<=n;i++) add(S,i,U,0),add(i,T,U-2*p[i]-deg[i],0);cout<<(U*n-dinic())/2<<'\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客练习赛79E-小G的数学难题【dp,单调队列】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出nnn个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)。 要求选出一个集合SSS&#xff0c;要求 (∑i∈Sai)≤P,(∑i∈Sbi)≥P\left(\sum_{i\in S}a_i\right)\leq P,\left(\sum_{i\in S}b_i\right)\…

手把手教你写DI_2_小白徒手撸构造函数注入

在上一节&#xff1a;手把手教你写DI_1_DI框架有什么&#xff1f;我们已经知道我们要撸哪些东西了那么我们开始动工吧&#xff0c;这里呢&#xff0c;我们找小白同学来表演下小白同学 &#xff1a;我们先定义一下我们的广告招聘纸有什么&#xff1a;好&#xff0c;我们实现两种…

E. Pattern Matching(题意理解+拓扑排序)

E. Pattern Matching 首先p[mtj]p[mt_j]p[mtj​]必须能够匹配所给字符sjs_jsj​&#xff0c;然后把所有能够匹配的sjs_jsj​的其他模板串也找出来&#xff0c;这些必须放在p[mtj]p[mt_j]p[mtj​]的后面&#xff0c;典型拓扑排序&#xff0c;连边然后排序即可 #define IO ios:…

Sum

链接&#xff1a;https://ac.nowcoder.com/acm/problem/14269 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 考虑维护一个这样的问题&#xff1a…

NOI.AC#2266-Bacteria【根号分治,倍增】

正题 题目链接:http://noi.ac/problem/2266 题目大意 给出nnn个点的一棵树&#xff0c;有一些边上有中转站&#xff08;边长度为222&#xff0c;中间有一个中转站&#xff09;&#xff0c;否则就是边长为111。 mmm次询问一个东西从xxx出发走到yyy&#xff0c;每隔kkk步中转站…

服务器win2008 R2 x64 部署ASP.net core到IIS 并解决 HTTP Error 502.5 的问题

1、发布网站 &#xff1b;2、安装 vc_redist.x64 (Visual C Redistributable for Visual Studio 2015) 新装的系统没装的补丁&#xff0c;装过略过&#xff1b;3、安装WindowsHosting &#xff1a;如&#xff1a; dotnet-hosting-2.1.3-win &#xff1b;4、安装.Net Core SDK&…

codeforces1271 D. Portals(dp or 带悔贪心)

D. Portals 由于每个点可以选择前面的某些点存在重复选择的情况&#xff0c;考虑除去重复选择的可能。 贪心&#xff1a;对于每一个城堡&#xff0c;我们都尽可能在最晚的时间控制&#xff0c;也就是在最后一个能控制它的点考虑是否控制。 于是考虑设计dp 状态表示&#xf…

P3337-[ZJOI2013]防守战线【单纯形】

正题 题目链接:https://www.luogu.com.cn/problem/P3337 题目大意 nnn个地方可以建立塔也可以不建立塔&#xff0c;第iii个位置建立需要消耗CiC_iCi​元 mmm个限制要求在某个区间内的塔的数量超过DiD_iDi​ 1≤n≤1000,1≤m≤100001\leq n\leq 1000,1\leq m\leq 100001≤n≤10…

Data Structure Problem

试题链接 题目描述 题意&#xff1a; 有两个序列&#xff0c; 操作1是将a序列的第x位改成y 操作2是将b序列的第x位改成y 操作3是找到一个cx&#xff0c;满足递推式c00&#xff0c;ci max(ci-1bi&#xff0c;ai) 题解&#xff1a; 官方题解 说实话我没大看懂。。。 题是我同…

定制Ocelot来满足需求

这篇文章&#xff0c;我们将从Ocelot的中间件源码分析&#xff0c;目前Ocelot已经实现那些功能&#xff0c;还有那些功能在我们实际项目中暂时还未实现&#xff0c;如果我们要使用这些功能&#xff0c;应该如何改造等方面来说明。一、Ocelot源码解读在使用一个组件前&#xff0…

codeforces1151 E. Number of Components(计数)

E. Number of Components 方法一&#xff1a;考虑每个点的贡献&#xff0c;认为一个联通块里让编号最大的点产生贡献 那么&#xff0c;对于一个点 iii&#xff0c;如果对答案产生贡献&#xff0c;一定要点 iii 存在&#xff0c;而点 i1i 1i1 不存在。 #define IO ios::sync_…

P2490-[SDOI2011]黑白棋【博弈论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2490 题目大意 一个长度为nnn的棋盘上放下kkk个棋子。 第一个要是白色&#xff0c;下一个要是黑色&#xff0c;在下一个是白色以此类推。 先手操控白&#xff0c;后手操控黑。白色只能往右&#xff0c;黑色只能往左。每次…

【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

从本文开始&#xff0c;我们正式进入项目研发阶段&#xff0c;首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求&#xff0c;在梳理完这些需求后&#xff0c;设计好系统采用的架构来满足已有的需求和未来的扩展应用。1 功能性需求统一认证平台应该具备以下基本…

Shift and Reverse

题目链接 题意&#xff1a; 一个序列a1&#xff0c;a2&#xff0c;a3…an 选择一个i&#xff0c;然后将序列改成ai,ai-1,…a1,an,an-1,…ai1 可以进行无数次这样的操作 问&#xff1a;最多有多少不同的序列产生&#xff1f;&#xff08;答案mod1e97&#xff09; 题解&#xf…

UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】

正题 题目链接:https://uoj.ac/problem/33 题目大意 给出nnn个点的一棵树 定义f(x,y)gcd(dis(x,lca),dis(y,lca))f(x,y)gcd(\ dis(x,lca),dis(y,lca)\ )f(x,y)gcd( dis(x,lca),dis(y,lca) )。 对于每个iii求有多少对f(x,y)i(x<y)f(x,y)i(x<y)f(x,y)i(x<y) 1≤n≤1…

codeforces1167 E. Range Deleting(双指针)

E. Range Deleting 首先不难知道如果f(l,r)f(l,r)f(l,r)满足题意&#xff0c;那么f(l,r1),f(l,r2),…,f(l,x)f(l,r1),f(l,r2),\dots,f(l,x)f(l,r1),f(l,r2),…,f(l,x)都满足题意。 因而对于每一个左端点lll&#xff0c;需要找到最小的一个右端点rrr 单调性&#xff1a;对于每…

Redis基本使用及百亿数据量中的使用技巧分享

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9941208.html作者&#xff1a;大石头时间&#xff1a;2018-11-10 晚上20&#xff1a;00地点&#xff1a;钉钉群&#xff08;组织代码BKMV7685&#xff09;QQ群&#xff1a;1600800内容&#xff1…

Subsequence Pair

题目 题目描述 题意&#xff1a; X和Y两个字符串&#xff0c;两个字符串各取子序列X1和Y1&#xff0c;问X1<Y1的情况下X1和Y1的长度和最长是多少&#xff1f; 比如例子&#xff1a; zazxwabzczazazd abcaa 第一个字符串选取子序列为azxwabzczazazd 第二个为bcaa azxwabzc…

NOI.AC#2144-子串【SAM,倍增】

正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa。将字符串sss的所有本质不同子串降序排序后&#xff0c;求有多少个区间[l,r][l,r][l,r]使得子串sl,rs_{l,r}sl,r​排名等于al∼ra_{l\sim r}al∼r​的和。 1≤n≤21051\leq n\leq 2\times…

codeforces1481 E. Sorting Books(贪心+dp)

大佬题解1 大佬题解2 E. Sorting Books 首先每本书都移动&#xff0c;移动次数是n能够满足题意。如果某些书不用移动&#xff0c;说明把隔开他们中间的书全部抽走后自然成组。 对于每本书全部移动的情况&#xff0c;显然我们可以选择一种颜色的书全部不案&#xff0c;移动别…