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. 使用SPLUNK进行简单Threat Hunting

    通过订阅网上公开的恶意ip库(威胁情报),与SIEM平台中网络流量日志进行匹配,获得安全事件告警. 比如,这里有一个malware urls数据下载的网站,每天更新一次: https://urlhau ...

  2. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  3. python爬虫多线程编程

    #使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...

  4. 004_Gradle 笔记——Java构建入门

    Gradle是一个通用的构建工具,通过它的构建脚本你可以构建任何你想要实现的东西,不过前提是你需要先写好构建脚本的代码.而大部分的项目,它 们的构建流程基本是一样的,我们不必为每一个工程都编写它的构建 ...

  5. 简约而不简单的Django

    本文面向:有python基础,刚接触web框架的初学者. 环境:windows7   python3.5.1  pycharm专业版  Django 1.10版 pip3 一.Django简介 百度百 ...

  6. C/C++——C语言跳出多重循环方法

    c语言的break语句只能跳出离它最近的一层循环,但是我们有时候需要跳出多层循环,以下有几种跳出多重循环的方法: 1. 使用goto ; i < MAX1; i++) { ; j < MA ...

  7. Zabbix3.0源码安装

    环境:nginx1.6.3 php-5.6.22 mysql-5.5.49 请参考前面的博文自行搭建 安装依赖并创建用户 [root@test88 ~]# yum install -y libxml2 ...

  8. DB2:FETCH FIRST 1 ROWS ONLY

    DB2:FETCH FIRST ROWS ONLY,在Oracle中使用where rownum=1代替 DB2: SELECT INSTORAGENO FROM ( SELECT max(AUDIT ...

  9. IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...

  10. 06 java 基础:java 循环 递归

    1 递归实现 1 + 2 +3 +4 +5 + .... +100 public static int addSum(int num){ if(num == 1) return 1; return n ...