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

(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

#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模板的更多相关文章

  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. 【HTML】 HTML基础知识 表单

    html 表单 表单的标签是<form>,用于给网站的后台提交数据.提交的数据格式原本是什么样不太清楚,以python的flask框架来看,我从表单中得到的数据是一个字典(flask.re ...

  2. Algorithm --> 判读是否是子树

    问题 判断一棵树是否是另一棵树的子树,如图 思路 问题分两步: 找值相同的根结点(遍历解决) 判断两结点是否包含(递归:值.左孩子.右孩子分别相同) 树节点定义 struct TreeNode { i ...

  3. Laravel 模型事件入门

    Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除. Laravel 模型事件文档 概述了如何使用钩子将对应事件与相关的事件类型关联起来,但是本文的主旨 ...

  4. web服务器学习1---httpd-2.4.29源码手动编译安装

    环境准备: 系统:CentOS 7.4 软件:httpd-2.4.29 一  Apache主要特点 apache服务器在功能,性能和安全性等方面表现比较突出,可以较好地满足web服务器地应用需求.主要 ...

  5. 2018.3.28html学习笔记

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  6. beta冲刺5

    昨天的问题: 登陆页面的整合重新制作 各主机版本更迭 我的社团显示功能修改调整 主页的头部替换掉 +修复帖子无法显示内容的问题 +试着将邮箱等判定用正则表达式进行实时判定. 今天的完成: 主要是线下进 ...

  7. bug终结者 团队作业第四、五周

    bug终结者 团队作业第四.五周 博客编辑者:20162322朱娅霖 本周学习任务: 团队协作完成<需求规格说明书> 工作流程 第四周 团队成员各自完成蓝墨云班课中<需求规格说明书& ...

  8. 20162327WJH程序设计与数据结构第七周总结

    学号 20162327 <程序设计与数据结构>第7周学习总结 教材学习内容总结 1.关于接口的理解:接口可以理解为比较纯粹的抽象类 2.接口的特点:用interface定义接口 接口中的方 ...

  9. 20162321王彪-实验二-Java面向对象程序设计

    实验二Java面向对象程序设计 实验内容一 初步掌握单元测试和TDD 什么是单元测试:单元测试时开发者编写的一小段代码,用于检测被测代码的一个很小的,很明确的功能是否正确.执行单元测试,是为了证明某段 ...

  10. 20145237 实验一 逆向与Bof基础

    20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...