经典例题,好像说可以转化成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. knockoutJS学习笔记08:表单域绑定

    前面的绑定都是用在基本标签上,这章主要讲表单域标签的绑定. 一.value 绑定 绑定标签:input text.textarea. <p>用户名:<input type=" ...

  2. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  3. WCF学习笔记一

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...

  4. JS正则表达式进阶

    贪婪量词   惰性量词    支配量词                      描述--------------------------------------------------------- ...

  5. MySQL学习

    关于MySQL学习,先推荐一个网站,资源很多.讲得很细 StudyMySQL-最好的MySQL学习网站 我的MySQL学习之旅: 1.简单了解下MySQL数据库,安装MySQL.MySQL管理工具(刚 ...

  6. the pipeline of call SNP

    ######################################## ############### Mapping ################ ################## ...

  7. 【poj1742】 Coins

    http://poj.org/problem?id=1742 (题目链接) 题意 给出n钟纸币,每种纸币面值为a[i],数量为c[i],问能够成多少数值小于等于m的数. Solution 先想到了容斥 ...

  8. Nginx简易配置文件(一)(静态页面及PHP页面解析)

    user nobody nobody; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; events { use e ...

  9. Java 正则表达式详解

    Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...

  10. WinForm------GridControl合并单元格

    1.修改GridView的属性 2.点击Run Design修改需要合并的列的属性 3.给GridView添加事件(以上两步不行的情况下再使用此方法) private void gridView1_C ...