[bzoj1497][NOI2006]最大获利_网络流_最小割
最大获利 bzoj-1497
题目大意:可以建立一个点,花费一定的代价;将已经建立的两个点之间连边,得到一定收益。有些节点之间是不允许连边的。
注释:1<=点数<=5,000,1<=允许连边的边数<=50,000。
想法:将每个可以相连的点之间的边在网络流里建立成一个节点,将源点连这条边的收获,向这两条边的端点分别连两条inf的边,所有的端点向源点连边权为该点代价的边。然后由最大流等于最小割,求最大流即可。
最后,附上丑陋的代码... ...
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- #define inf 0x3f3f3f3f
- using namespace std;
- int head[400010],to[400010],nxt[400010],tot=1;
- int dis[400100];
- int n,m;
- // int p[10010];
- int f[400010];
- inline void add(int x,int y,int z)
- {
- to[++tot]=y;
- f[tot]=z;
- nxt[tot]=head[x];
- head[x]=tot;
- }
- bool bfs()
- {
- queue<int> q;
- memset(dis,-1,sizeof dis);
- q.push(1);dis[1]=0;
- while(!q.empty())
- {
- int x=q.front();q.pop();
- for(int i=head[x];i;i=nxt[i])
- {
- if(f[i]>0&&dis[to[i]]==-1)
- {
- dis[to[i]]=dis[x]+1;
- q.push(to[i]);
- if(to[i]==n+m+2) return true;
- }
- }
- }
- return false;
- }
- int dinic(int x,int flow)
- {
- int a,temp=flow;
- if(x==n+m+2) return flow;
- for(int i=head[x];i;i=nxt[i])
- {
- if(f[i]>0&&dis[to[i]]==dis[x]+1)
- {
- a=dinic(to[i],min(f[i],temp));
- if(!a) dis[to[i]]=-1;
- temp-=a;
- f[i]-=a;
- f[i^1]+=a;
- if(!temp) break;
- }
- }
- return flow-temp;
- }
- int main()
- {
- cin >> n >> m;
- int all=n+m+2;
- for(int a,i=1;i<=n;i++)
- {
- cin >> a;
- add(1+m+i,all,a);
- add(all,1+m+i,0);
- }
- int sum=0;
- for(int a,b,c,i=1;i<=m;i++)
- {
- cin >> a >> b >> c;
- sum+=c;
- add(1,1+i,c);add(1+i,1,0);
- add(1+i,1+m+a,inf);add(1+m+a,1+i,0);
- add(1+i,1+m+b,inf);add(1+m+b,1+i,0);
- }
- int ans=0;
- while(bfs())
- {
- // puts("Fuck");
- ans+=dinic(1,inf);
- }
- cout << sum - ans << endl;
- return 0;
- }
小结:最小割等于最大流
[bzoj1497][NOI2006]最大获利_网络流_最小割的更多相关文章
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- 【CF331E】Biologist(网络流,最小割)
[CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...
- 【BZOJ1391】Order(网络流,最小割)
[BZOJ1391]Order(网络流,最小割) 题面 BZOJ权限题... 良心洛谷 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成 ...
- 【BZOJ3144】切糕(网络流,最小割)
[BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...
- BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...
- BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4375 Solved: 2142[Submit][Status] ...
- [bzoj2561]最小生成树_网络流_最小割_最小生成树
最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...
- [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...
- [bzoj3894]文理分科_网络流_最小割
文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...
随机推荐
- dojo之FilteringSelect
1.保证可视框宽度与下拉框宽度一致 forceWidth:'true' 2.控制下拉框的高度 maxHeight:'120'
- SQL注入攻击三部曲之高级篇
SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...
- Java求素数时出现错误
Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...
- Unhandled event loop exception No more handles
1.错误描述 2.错误原因 3.解决办法
- VxWorks操作系统shell命令与调试方法总结
VxWorks下的调试手段 主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤.思路. 1 Tornado的调试工具 嵌入式实时操作系统VxWorks和集成开发 ...
- C# 通过smtp服务器进行邮件发送 MailHelper
C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...
- 微信开发中access_token,js_ticket,时间戳,签名生成工具
Access_token生成工具 工具地址:https://mp.weixin.qq.com/debug 这个工具主要用来验证和生成微信公众号access_token,主要有正确的app_id和app ...
- Echarts自动刷新数据
1.Echarts自动刷新数据 1.Echarts柱状图的正常配置 注:声明了 myChart.test这两个都有用 官方示例中myChart是声明在 function(ec)里面的 <scri ...
- Python Cookbook(第3版)中文版:15.15 C字符串转换为Python字符串
15.15 C字符串转换为Python字符串¶ 问题¶ 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案¶ C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到 ...
- [ZJOI2007]时态同步
题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...