(我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!)

(Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~

这是本人网络流入门第二题,不知道怎么解释,

给大家推荐几个博客方便大家入门网络流:

网络流入门博客1

网络流入门博客2

看之前大家可以去百度一下网络流入门术语,这对新手入门网络流会有一些帮助)

题意:

  用人话解释:

  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

  1. #include<bits/stdc++.h>
  2. #define test printf("***\n")
  3. #define mm1(a) memset((a),-1,sizeof((a)))
  4. #define mm0(a) memset((a),0,sizeof((a)))
  5. #define mmx(a) memset((a),0x3f,sizeof((a)))
  6. #define lowbit(x) (x)&(-(x))
  7. #define iis std::ios::sync_with_stdio(false)
  8. using namespace std;
  9. typedef long long LL;
  10. typedef unsigned long long uLL;
  11. const int N = ;
  12. const int M = ;
  13. const int X = ;
  14. const int INF = 0x3f3f3f3f;
  15. const LL INFLL = 0x3f3f3f3f3f3f3f3f;
  16. const double eps = 1e-;
  17. const int mod = 1e9 + ;
  18. int n,m,tot,num1,num2;
  19. int d[N];
  20. //<font color=black size=4>1</font>
  21. int head[N];
  22. struct lp{
  23. int to,w,nex;
  24. lp(){}
  25. lp(int a,int b,int c){to=a;w=b;nex=c;}
  26. }cw[N*];
  27. inline void add(int a,int b,int c){
  28. cw[++tot]=lp(b,c,head[a]);
  29. head[a]=tot;
  30. }
  31. inline bool bfs(){
  32. mm1(d);
  33. queue<int>Q;
  34. Q.push();d[]=;
  35. while(!Q.empty()){
  36. int u=Q.front();
  37. Q.pop();
  38. for(int i=head[u];i!=-;i=cw[i].nex){
  39. int v=cw[i].to;
  40. if(cw[i].w&&d[v]==-){
  41. d[v]=d[u]+;
  42. Q.push(v);
  43. }
  44. }
  45. }
  46. return d[n+]!=-;
  47. }
  48. //dfs这块有很多优化的地方可以加速,但是我还不会
  49. //有什么弧优化和多路增广等
  50. inline int dfs(int x,int f){
  51. if(x==n+||f==) return f;
  52. int use=,w;
  53. for(int i=head[x];i!=-;i=cw[i].nex){
  54. int to=cw[i].to;
  55. if(d[to]==d[x]+ && cw[i].w){
  56. w=dfs(to,min(cw[i].w,f-use));
  57. cw[i].w-=w,cw[i^].w+=w;
  58. use+=w;
  59. if(use==f) return f;
  60. }
  61. }
  62. return use;
  63. }
  64. inline void init(){
  65. tot=-;
  66. mm1(head);
  67. }
  68. int main(){
  69. #ifdef DEBUG
  70. freopen("D:in.in", "r", stdin);
  71. freopen("D:out.out", "w", stdout);
  72. #endif
  73. while(cin>>n>>num1>>num2>>m){
  74. init();
  75. int x,y,z,a,b;char o;
  76. for(int i=;i<m;++i){
  77. cin>>o>>x>>o>>y>>o>>z;
  78. add(x+,y+,z);add(y+,x+,);
  79. }
  80. for(int i=;i<num1;++i){
  81. cin>>o>>a>>o>>b;
  82. add(,a+,b);add(a+,,);
  83. }
  84. for(int i=;i<num2;++i){
  85. cin>>o>>a>>o>>b;
  86. add(a+,n+,b);add(n+,a+,);
  87. }
  88. int ans=;
  89. while(bfs()){
  90. ans+=dfs(,1e7);
  91. }
  92. printf("%d\n",ans );
  93. }
  94. #ifdef DEBUG
  95. fclose(stdout);
  96. fclose(stdin);
  97. #endif
  98. return ;
  99. }
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define mme(a,b) memset((a),(b),sizeof((a)))
  5. #define test printf("***\n")
  6. #define fuck(x) cout<<"* "<<x<<"\n"
  7. #define iis std::ios::sync_with_stdio(false)
  8. using namespace std;
  9. typedef long long LL;
  10.  
  11. const LL INF=1e17;
  12. const int MAXN = 1e5+;
  13. const int MAXE = MAXN*;
  14. struct ISAP{
  15. int vs,vt,tot,head[MAXN],level[MAXN],gap[MAXN];
  16. struct lp{
  17. int to,nex;
  18. LL w;
  19. }cw[MAXE];
  20. inline void Insert(int u,int v,int w){
  21. cw[++tot].to=v,cw[tot].nex=head[u],head[u]=tot,cw[tot].w=w;
  22. cw[++tot].to=u,cw[tot].nex=head[v],head[v]=tot,cw[tot].w=;
  23. }
  24. inline LL Min(LL x,LL y){return x<y?x:y;}
  25. LL SAP(int u,LL fl){
  26. if (u==vt) return fl;
  27. LL res=fl;
  28. for (int i=head[u];i;i=cw[i].nex){
  29. if (cw[i].w&&level[cw[i].to]+==level[u]){
  30. LL t=SAP(cw[i].to,Min(res,cw[i].w));
  31. cw[i].w-=t,cw[i^].w+=t;
  32. if (!(res-=t)) return fl;
  33. }
  34. }
  35. if (!(--gap[level[u]])) level[vt]=vt;
  36. ++gap[++level[u]];
  37. return fl-res;
  38. }
  39. LL maxFlow(){
  40. LL ans = ;
  41. gap[]=vt;
  42. while (level[vt]!=vt){ans+=SAP(vs,INF);}
  43. return ans;
  44. }
  45. void init(int _vs,int _vt){
  46. memset(head,,sizeof(head));
  47. memset(gap,,sizeof(gap));
  48. memset(level,,sizeof(level));
  49. vs=_vs;vt=_vt;
  50. tot=;
  51. }
  52. }sap;
  53. const int N = ;
  54. int n,m;
  55. int vs,vt;
  56. int num[<<];
  57. int main(){
  58. #ifndef ONLINE_JUDGE
  59. freopen("E://ADpan//in.in", "r", stdin);
  60. //freopen("E://ADpan//out.out", "w", stdout);
  61. #endif
  62. while(~scanf("%d%d",&n,&m)){
  63. int state = <<m;
  64. mme(num,);
  65. vs=state+m+,vt=state+m+;
  66. sap.init(vs,vt);
  67. for(int i=;i<=n;++i){
  68. int tmp=;
  69. for(int j=;j<=m;++j){
  70. int x;scanf("%d",&x);
  71. if(x)tmp|=(<<(j-));
  72. }
  73. num[tmp]++;
  74. }
  75. for(int i=;i<=m;++i){
  76. int x;scanf("%d",&x);
  77. sap.Insert(vs,i+state,x);
  78. }
  79. for(int i=;i<state;++i){
  80. if(num[i]==)continue;
  81. sap.Insert(i,vt,num[i]);
  82. for(int j=;j<m;++j){
  83. if(i&(<<j)){
  84. sap.Insert(state+j+,i,num[i]);
  85. }
  86. }
  87. }
  88. LL ans = sap.maxFlow();
  89. if(ans>=n)printf("YES\n");
  90. else printf("NO\n");
  91. }
  92. return ;
  93. }

网络流入门-POJ1459PowerNetwork-Dinic模板的更多相关文章

  1. poj1273 网络流入门题 dinic算法解决,可作模板使用

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 62078   Accepted: 2384 ...

  2. 网络流--最大流dinic模板

    标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...

  3. 网络流-最大流 Dinic模板

    #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...

  4. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  5. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  6. nyoj_323:Drainage Ditches(网络流入门)

    题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...

  7. Tile Cut~网络流入门题

    Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...

  8. hdu 1532 Dinic模板(小白书)

    hdu1532 输入n,m. n条边,m个点,之后给出a到b的容量,求1到m的最大流. 注意:Dinic只能调用一次,因为原理是改变cap的值,如果调用多次一样的,那么第一次会对,其余的都会是0,因为 ...

  9. Thinkphp入门三—框架模板、变量(47)

    原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display()   调用当前操作名称的模板 display(‘名字’)  调用指定名字的模板文件 控制器调用模板四种方式 ...

随机推荐

  1. [poj3107]Godfather_树形dp_树的重心

    Godfather poj-3107 题目大意:求树的重心裸题. 注释:n<=50000. 想法:我们尝试用树形dp求树的重心,关于树的重心的定义在题目中给的很明确.关于这道题,我们邻接矩阵存不 ...

  2. 分享:docker swarm集群搭建

    [Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu.   网上有用docker-machine创建虚拟机做的例子.   这里直接用VMware创建这三台虚拟机,然后用xshell连 ...

  3. Vue项目使用CDN优化首屏加载

    前言 作为一个网站应用,加载速度是非常重要的.加载速度,一个是程序的合理安排,如以组件按需加载,一个是js.css等资源的异步加载. 在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打 ...

  4. 【RabbitMQ系列】 Spring mvc整合RabbitMQ

    一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...

  5. windows下apache报os 10048错误

    在apache的bin目录下运行httpd -k install,报错os10048 (错误信息是跟443端口有关),网上的答案说的是改掉httpd.conf里的默认端口或者关闭占用端口的进程,默认端 ...

  6. 忘记oracle的sys密码该如何重置;附如何修改oracle数据库用户密码

    参考博客:http://blog.itpub.net/26015009/viewspace-717505/ 这里只说一种方法:使用ORAPWD.EXE 工具修改密码 打开命令提示符窗口,输入如下命令: ...

  7. transient 与 volatile 笔记

    1. transient 词义:瞬间的,短暂的 首先说说"序列化",把一个对象的表示转化为字节流的过程称为串行化(也称为序列化,serialization),从字节流中把对象重建出 ...

  8. 201421123042 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  9. Flask学习 二 模板

    jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...

  10. 2017 国庆湖南 Day5

    期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...