网络流入门-POJ1459PowerNetwork-Dinic模板
(我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!)
(Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~
这是本人网络流入门第二题,不知道怎么解释,
给大家推荐几个博客方便大家入门网络流:
看之前大家可以去百度一下网络流入门术语,这对新手入门网络流会有一些帮助)
题意:
用人话解释:
1. 给你 n 个点,m个边,num1个发电站,num2个用户;
2. 每条边有一个负载量,求用户收到的最大用电量;
3. 显而易见,是网络流中最大流的裸题,只是需要一个简单的处理;
4. 虽然每个发电站都是一个源点,每个用户都是一个汇点;但是你可以设置一个终极源点和终极汇点;
5. 意思是:终极源点0向每个发电站连一条边,权值为发电站的发电量;每个用户向终极汇点连一条边,权值为用户的限值量;当然还要建反向边;
6. 如此,题目便简化为求:点0到点n+1的最大流问题,Dinic板子水过,不过这板子应该还能优化。
思路:
1. 解题思路就在上面。
2. 说实话,关于算法本身我还说不出什么来,毕竟刚刚入门,(可能还没入门)对很多大神的解释还是一知半解,也就只能套板子写裸题了。
3. 关于网络流出了Dinic算法还有一些算法如:FF算法,EK算法,E'K'算法,预流推进算法,SAP算法;
4. 目前准备把每种算法的板子都准备好,板子来源就是从各个大佬博客搜刮!
5. 搜刮板子的同时,试着理解算法到底优化在哪里,强在哪里,为什么要那样处理;
6. 先从代码理解算法,然后试着搞懂算法的意思,各种专业术语也一定要理解;首先会写板子题,再试着写有一点难的题;
7. 听说网络流相关一些题目,难就难在如何建图,能建图就好解决了。看来如果不真正的理解网络流,只拘泥于板子题,实则啥都不会!
题目链接:
AC代码:
1266ms
- #include<bits/stdc++.h>
- #define test printf("***\n")
- #define mm1(a) memset((a),-1,sizeof((a)))
- #define mm0(a) memset((a),0,sizeof((a)))
- #define mmx(a) memset((a),0x3f,sizeof((a)))
- #define lowbit(x) (x)&(-(x))
- #define iis std::ios::sync_with_stdio(false)
- using namespace std;
- typedef long long LL;
- typedef unsigned long long uLL;
- const int N = ;
- const int M = ;
- const int X = ;
- const int INF = 0x3f3f3f3f;
- const LL INFLL = 0x3f3f3f3f3f3f3f3f;
- const double eps = 1e-;
- const int mod = 1e9 + ;
- int n,m,tot,num1,num2;
- int d[N];
- //<font color=black size=4>1</font>
- int head[N];
- struct lp{
- int to,w,nex;
- lp(){}
- lp(int a,int b,int c){to=a;w=b;nex=c;}
- }cw[N*];
- inline void add(int a,int b,int c){
- cw[++tot]=lp(b,c,head[a]);
- head[a]=tot;
- }
- inline bool bfs(){
- mm1(d);
- queue<int>Q;
- Q.push();d[]=;
- while(!Q.empty()){
- int u=Q.front();
- Q.pop();
- for(int i=head[u];i!=-;i=cw[i].nex){
- int v=cw[i].to;
- if(cw[i].w&&d[v]==-){
- d[v]=d[u]+;
- Q.push(v);
- }
- }
- }
- return d[n+]!=-;
- }
- //dfs这块有很多优化的地方可以加速,但是我还不会
- //有什么弧优化和多路增广等
- inline int dfs(int x,int f){
- if(x==n+||f==) return f;
- int use=,w;
- for(int i=head[x];i!=-;i=cw[i].nex){
- int to=cw[i].to;
- if(d[to]==d[x]+ && cw[i].w){
- w=dfs(to,min(cw[i].w,f-use));
- cw[i].w-=w,cw[i^].w+=w;
- use+=w;
- if(use==f) return f;
- }
- }
- return use;
- }
- inline void init(){
- tot=-;
- mm1(head);
- }
- int main(){
- #ifdef DEBUG
- freopen("D:in.in", "r", stdin);
- freopen("D:out.out", "w", stdout);
- #endif
- while(cin>>n>>num1>>num2>>m){
- init();
- int x,y,z,a,b;char o;
- for(int i=;i<m;++i){
- cin>>o>>x>>o>>y>>o>>z;
- add(x+,y+,z);add(y+,x+,);
- }
- for(int i=;i<num1;++i){
- cin>>o>>a>>o>>b;
- add(,a+,b);add(a+,,);
- }
- for(int i=;i<num2;++i){
- cin>>o>>a>>o>>b;
- add(a+,n+,b);add(n+,a+,);
- }
- int ans=;
- while(bfs()){
- ans+=dfs(,1e7);
- }
- printf("%d\n",ans );
- }
- #ifdef DEBUG
- fclose(stdout);
- fclose(stdin);
- #endif
- return ;
- }
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #define mme(a,b) memset((a),(b),sizeof((a)))
- #define test printf("***\n")
- #define fuck(x) cout<<"* "<<x<<"\n"
- #define iis std::ios::sync_with_stdio(false)
- using namespace std;
- typedef long long LL;
- const LL INF=1e17;
- const int MAXN = 1e5+;
- const int MAXE = MAXN*;
- struct ISAP{
- int vs,vt,tot,head[MAXN],level[MAXN],gap[MAXN];
- struct lp{
- int to,nex;
- LL w;
- }cw[MAXE];
- inline void Insert(int u,int v,int w){
- cw[++tot].to=v,cw[tot].nex=head[u],head[u]=tot,cw[tot].w=w;
- cw[++tot].to=u,cw[tot].nex=head[v],head[v]=tot,cw[tot].w=;
- }
- inline LL Min(LL x,LL y){return x<y?x:y;}
- LL SAP(int u,LL fl){
- if (u==vt) return fl;
- LL res=fl;
- for (int i=head[u];i;i=cw[i].nex){
- if (cw[i].w&&level[cw[i].to]+==level[u]){
- LL t=SAP(cw[i].to,Min(res,cw[i].w));
- cw[i].w-=t,cw[i^].w+=t;
- if (!(res-=t)) return fl;
- }
- }
- if (!(--gap[level[u]])) level[vt]=vt;
- ++gap[++level[u]];
- return fl-res;
- }
- LL maxFlow(){
- LL ans = ;
- gap[]=vt;
- while (level[vt]!=vt){ans+=SAP(vs,INF);}
- return ans;
- }
- void init(int _vs,int _vt){
- memset(head,,sizeof(head));
- memset(gap,,sizeof(gap));
- memset(level,,sizeof(level));
- vs=_vs;vt=_vt;
- tot=;
- }
- }sap;
- const int N = ;
- int n,m;
- int vs,vt;
- int num[<<];
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("E://ADpan//in.in", "r", stdin);
- //freopen("E://ADpan//out.out", "w", stdout);
- #endif
- while(~scanf("%d%d",&n,&m)){
- int state = <<m;
- mme(num,);
- vs=state+m+,vt=state+m+;
- sap.init(vs,vt);
- for(int i=;i<=n;++i){
- int tmp=;
- for(int j=;j<=m;++j){
- int x;scanf("%d",&x);
- if(x)tmp|=(<<(j-));
- }
- num[tmp]++;
- }
- for(int i=;i<=m;++i){
- int x;scanf("%d",&x);
- sap.Insert(vs,i+state,x);
- }
- for(int i=;i<state;++i){
- if(num[i]==)continue;
- sap.Insert(i,vt,num[i]);
- for(int j=;j<m;++j){
- if(i&(<<j)){
- sap.Insert(state+j+,i,num[i]);
- }
- }
- }
- LL ans = sap.maxFlow();
- if(ans>=n)printf("YES\n");
- else printf("NO\n");
- }
- return ;
- }
网络流入门-POJ1459PowerNetwork-Dinic模板的更多相关文章
- poj1273 网络流入门题 dinic算法解决,可作模板使用
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62078 Accepted: 2384 ...
- 网络流--最大流dinic模板
标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...
- 网络流-最大流 Dinic模板
#include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- POJ 1273 Drainage Ditches (网络流Dinic模板)
Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...
- nyoj_323:Drainage Ditches(网络流入门)
题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...
- Tile Cut~网络流入门题
Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...
- hdu 1532 Dinic模板(小白书)
hdu1532 输入n,m. n条边,m个点,之后给出a到b的容量,求1到m的最大流. 注意:Dinic只能调用一次,因为原理是改变cap的值,如果调用多次一样的,那么第一次会对,其余的都会是0,因为 ...
- Thinkphp入门三—框架模板、变量(47)
原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display() 调用当前操作名称的模板 display(‘名字’) 调用指定名字的模板文件 控制器调用模板四种方式 ...
随机推荐
- [poj3107]Godfather_树形dp_树的重心
Godfather poj-3107 题目大意:求树的重心裸题. 注释:n<=50000. 想法:我们尝试用树形dp求树的重心,关于树的重心的定义在题目中给的很明确.关于这道题,我们邻接矩阵存不 ...
- 分享:docker swarm集群搭建
[Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu. 网上有用docker-machine创建虚拟机做的例子. 这里直接用VMware创建这三台虚拟机,然后用xshell连 ...
- Vue项目使用CDN优化首屏加载
前言 作为一个网站应用,加载速度是非常重要的.加载速度,一个是程序的合理安排,如以组件按需加载,一个是js.css等资源的异步加载. 在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打 ...
- 【RabbitMQ系列】 Spring mvc整合RabbitMQ
一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...
- windows下apache报os 10048错误
在apache的bin目录下运行httpd -k install,报错os10048 (错误信息是跟443端口有关),网上的答案说的是改掉httpd.conf里的默认端口或者关闭占用端口的进程,默认端 ...
- 忘记oracle的sys密码该如何重置;附如何修改oracle数据库用户密码
参考博客:http://blog.itpub.net/26015009/viewspace-717505/ 这里只说一种方法:使用ORAPWD.EXE 工具修改密码 打开命令提示符窗口,输入如下命令: ...
- transient 与 volatile 笔记
1. transient 词义:瞬间的,短暂的 首先说说"序列化",把一个对象的表示转化为字节流的过程称为串行化(也称为序列化,serialization),从字节流中把对象重建出 ...
- 201421123042 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- Flask学习 二 模板
jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...
- 2017 国庆湖南 Day5
期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...