http://www.lydsy.com/JudgeOnline/problem.php?id=1497

 
思路:(最大权闭合图的思路相同)
将所有的用户群获利(正值)作为一个点连一条权值为获利值的边到st点,将所有的建站消耗(输入的是正值但是是在获利中减去的所以实质还是负值)作为一个点连一条权值为消耗值的边到ed点,再将每个用户群点和其依赖的建站点连一条权值为无穷的边,求st到ed的最大流。
此时,所求的最大获利=所有用户群获利的和-最大流。
某条st到ed的路如果得不偿失,贡献的值就是用户群获利的值;否则,贡献值为建站消耗,从而起到了选择的作用。
 
算是网络流的复习,用奇怪的优化过的dinic才不会超时,其他的方法算最大流都是80分。
dinic的写法和我以前看到的不一样,减少了return次数从而减少了dfs的次数,让每次dfs的值就是目前图中所有路(不重合)能得到的值,大大节省了时间。
 
代码
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const int maxn=;
const int minf=<<;
int n,m;
int a[maxn]={};
int vis[maxn]={};
struct nod{
int y,next,v,rev;
}e[maxn*];
int head[maxn],dep[maxn],tot=;
void init(int x,int y,int v){
e[++tot].y=y;e[tot].v=v;e[tot].next=head[x],e[tot].rev=tot+;
head[x]=tot;
e[++tot].y=x;e[tot].v=;e[tot].next=head[y],e[tot].rev=tot-;
head[y]=tot;
}
int bfs(int st,int ed){
queue<int>q;
memset(dep,-,sizeof(dep));
dep[st]=;q.push(st);
int x,y,v;
while(!q.empty()){
x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
y=e[i].y;v=e[i].v;
if(dep[y]==-&&v){
dep[y]=dep[x]+;q.push(y);
}
}
}
return dep[ed]!=-;
}
int dfs(int x,int ed,int mi){
if(x==ed)return mi;
int y,v,f,tsn=;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;v=e[i].v;
if(v&&dep[y]==dep[x]+){
f=dfs(y,ed,min(mi-tsn,v));
e[i].v-=f;
e[e[i].rev].v+=f;
tsn+=f;
if(tsn==mi)return tsn;
}
}
if(!tsn)dep[x]=-;
return tsn; }
int dinic(int st,int ed){
int ans=;
while(bfs(st,ed)){
ans+=dfs(st,ed,minf);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
int x,y,v,st=n+m+,ed;
ed=st+;
int ans=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
init(i,ed,a[i]);
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&v);
ans+=v;
init(i+n,x,minf);
init(i+n,y,minf);
init(st,i+n,v);
}
printf("%d\n",ans-dinic(st,ed));
return ;
}

BZOJ 1497 JZYZOJ 1344 [NOI2006]最大获利 网络流 最大权闭合图的更多相关文章

  1. HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 题意: 思路: 论文题,只要看过论文的话就是小菜一碟啦~ 每个用户群i作为一个结点分别向相应的 ...

  3. BZOJ 1497 最大获利(最大权闭合图)

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 4686  Solved: 2295 [Submit][Statu ...

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

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5503  Solved: 2673 Description 新的技 ...

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

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

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

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

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

    1497: [NOI2006]最大获利 题目:传送门 题解: %%%关于最大权闭合子图很好的入门题 简单说一下什么叫最大权闭合子图吧...最简单的解释就是正权边连源点,负权边连汇点(注意把边权改为正数 ...

  8. NOI2006 最大获利(最大权闭合子图)

    codevs 1789 最大获利 2006年NOI全国竞赛  时间限制: 2 s  空间限制: 128000 KB   题目描述 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...

  9. _bzoj1497 [NOI2006]最大获利【最大权闭合子图】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1497 保存最大流模版. 选一个用户群,就必须要选对应的两个中转站,这种关系类似“最大全闭合子 ...

随机推荐

  1. indexof()函数

    js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf, 成功,返回索引值,失败返回 -1. 转载: http://www.cnblogs.com/fishtreeyu/arc ...

  2. maven使用过程中遇到的问题总汇

    1:web.xml is missing and <failOnMissingWebXml> is set to true 造成原因: 使用maven创建项目时有时在pom.xml的war ...

  3. Oracle笔记之用户管理

    1. 创建用户 创建用户使用create user语句,需要DBA权限: CREATE USER tom IDENTIFIED BY mot; 2. 更改用户密码 修改别人的密码需要DBA权限,或者a ...

  4. python碎片记录(三)

    1.不换行输出 for i in range(5):    print(i,end=' ')不换行打印,end表示每打印一个后面跟的字符 2.利用枚举方式打印输出索引与数值 a=[7,8,9]for ...

  5. ckeditor+ckfinder+java

    (java)Ckdeitor+ckfinder整合 第一步:工具下载 首先下载:CKEditor 地址:http://cdeditor.com/dowmload 接着下载CKFinder 地址:htt ...

  6. PHP7+Nginx的配置与安装教程详解

    下面脚本之家小编把PHP7+Nginx的配置与安装教程分享给大家,供大家参考,本文写的不好还请见谅. 系统环境:centos6.5 x64 软件版本:nginx-1.10.0 php-7.0.6 安装 ...

  7. 百度地图js lite api 支持点聚合

    百度地图lite api 是专门为h5 绘制海量点设计的,但是偏偏忽略掉了点聚合的需求,所以需要自己动手,做一次二次改造. 我们知道点聚合需要引入开源库: MarkerClusterer:  http ...

  8. [How to] HBase的bulkload使用方法

    1.简介 将数据插入HBase表中的方法很多,我们可以通过TableOutputFormat以Mapreduce on HBase的方式将数据插入,也可以单纯的使用客户端API将数据插入.但是以上方法 ...

  9. Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)

    一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...

  10. /boot/grub/grub.conf 内容诠释

    linux的启动配置文件GRUB启动时会在 /boot/grub 中寻找一个名字为grub.conf的配置文件,如果找不到此配置文件则不进入菜单模式而直接进入命令行模式. grub.conf是一个纯文 ...