经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法。

题意:输入n个点,m条边的无向图。点权为负,边权为正,点权为代价,边权为获益,输出最大获益。

(最大权闭合子图:图中各点的后继必然也在图中)

构图攻略:将边看做点,

若选某条边e[i](u,v,w),则必须选点u,v。由此构成一个有向图。也符合最大权闭合子图模型。

对原本的边e[i](u,v,w)连3条边(S,n+i,w),(n+i,u,inf),(n+i,v,inf)。

对原本的点v,连1条边(v,T,p[v])。

即正权点与源点连,负权点与汇点连。

求最大流,记所有边的正权和为sum,则sum-maxflow就是答案。

显然,sap图的点有n+m+2,边有(n+m*3)*2。

具体证明推导请移步前辈的论文或者别的网站也有很详细的介绍和步骤。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <queue>
using namespace std; #define ll long long
#define MP make_pair #define mxn 56000
#define mxe (51000*4*2)
#define inf 1e9
#define eps 1e-8 struct SAP{
int dis[mxn],pre[mxn],gap[mxn],arc[mxn];
int f[mxe],cap[mxe];
int head[mxn],nxt[mxe],vv[mxe],e;
void init(){e=0;memset(head,-1,sizeof(head));}
void add(int u,int v,int c){
vv[e]=v,cap[e]=c,nxt[e]=head[u],head[u]=e++;
vv[e]=u,cap[e]=0,nxt[e]=head[v],head[v]=e++;
}
ll max_flow(int s,int t,int n){
int q[mxn],j,mindis;
ll ans=0;
int ht=0,tl=1,u,v;
int low;
bool found,vis[mxn];
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
memset(vis,0,sizeof(vis));
memset(arc,-1,sizeof(arc));
memset(f,0,sizeof(f));
q[0]=t;vis[t]=true;dis[t]=0;gap[0]=1;
while(ht<tl){
u=q[ht++];
for(int i=head[u];i!=-1;i=nxt[i]){
v = vv[i];
if(!vis[v]){
vis[v]=true;
dis[v]=dis[u]+1;
q[tl++]=v;
gap[dis[v]]++;
arc[v]=head[v];
}
}
}
u=s;low=inf;pre[s]=s;
while(dis[s]<n){
found=false;
for(int &i=arc[u];i!=-1;i=nxt[i]){
if(dis[vv[i]]==dis[u]-1 && cap[i]>f[i]){
found=true;v=vv[i];
low=min(low,cap[i]-f[i]);
pre[v]=u;u=v;
if(u==t){
while(u!=s){
u=pre[u];
f[arc[u]]+=low;
f[arc[u]^1]-=low;
}
ans+=low;low=inf;
}
break;
}
}
if(found) continue;
mindis=n;
for(int i=head[u];i!=-1;i=nxt[i]){
if(mindis>dis[vv[i]] && cap[i]>f[i]){
mindis=dis[vv[j=i]];
arc[u]=i;
}
}
if(--gap[dis[u]]==0) return ans;
dis[u]=mindis+1;
gap[dis[u]]++;
u=pre[u];
}
return ans;
}
}sap;
int p[5050];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;++i) scanf("%d",p+i);
ll sum = 0;
sap.init();
for(int i=1;i<=m;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
sap.add(n+m+1,n+i,c);
sap.add(n+i,a,inf);
sap.add(n+i,b,inf);
sum+=c;
}
for(int i=1;i<=n;++i)
sap.add(i,n+m+2,p[i]);
ll mf = sap.max_flow(n+m+1,n+m+2,n+m+2);
printf("%I64d\n",sum-mf);
}
return 0;
}

HDU 3879 Base Station(最大权闭合子图)的更多相关文章

  1. HDU 3879 Base Station(最大权闭合子图)

    将第i个用户和他需要的基站连边,转化成求二分图的最大权闭合子图. 答案=正权点之和-最小割. # include <cstdio> # include <cstring> # ...

  2. hdu 3879 Base Station 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 A famous mobile communication company is plannin ...

  3. hdu3879 Base Station 最大权闭合子图 边权有正有负

    /** 题目:hdu3879 Base Station 最大权闭合子图 边权有正有负 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 题意:给出n个 ...

  4. HDU 3879 Base Station

    Base Station Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  5. hdu 5772 String problem 最大权闭合子图

    String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...

  6. hdu 3917 Road constructions 最大权闭合子图

    样例说明: n(城市数目)   m(工程队数目) 每个工程队上交的税收 val[i] k(k个工程) xi   yi  ci  costi , 工程队ci承包由xi到yi,政府的补贴为costi 注意 ...

  7. HDU 5855 Less Time, More profit 最大权闭合子图

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5855 Less Time, More profit Time Limit: 2000/1000 MS ...

  8. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...

  9. HDU5855 Less Time, More profit(最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...

随机推荐

  1. asp.net mvc ajax 异步刷新例子

    这几天在asp.net中使用ajax来做异步刷新,这里整理一下 1.首先看前台页面点击的时候调用函数 function shuxin() { $.ajax( { url: "GetValue ...

  2. 解决 PHPExcel 长数字串显示为科学计数

    解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...

  3. Dijkstra的双栈算术表达式的求值算法

    例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...

  4. PRINCE2

    首先要说的是,我这篇体会是针对一定的背景的,不能算是一种通用的管理方式,只能是我自己的经验总结,能给大家平常的管理提供一点思路,我就很满足了.先说说背景,我所在公司做的是大型桌面应用软件,简单点说就是 ...

  5. [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析

    0.前言 这篇文章写于去年的暑假.大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了<CG教程 ...

  6. [noip科普]关于LIS和一类可以用树状数组优化的DP

    预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以 ...

  7. wpf converter converterparameter 绑定多参数

    1. converterparameter不是依赖属性,所以不能用binding. 2. 可以把converter 的接口 IValueConverter改为 IMultiValueConverter ...

  8. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...

  9. Google Maps API V3 之绘图库 信息窗口

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  10. thinkphp标签

    1.volist标签 随后一条不一样的输出<volist name="pagehead" id="vo"> <if condition=&qu ...