#include<cstring>
#include<cstdio>
#define FOR(i,f_start,f_end) for(int i=f_startl;i<=f_end;i++)
#define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr))
const int maxn=;
const int maxm=2e4+;
int size;
int n;
const int inf=0x3f3f3f3f;
using namespace std;
int head[maxn];
void init(){
size=;
MS(head,-);
}
struct Node{
int from,to,cap,next;
}edge[maxn];
void add(int u,int v,int w){
edge[size].from=u;
edge[size].to=v;
edge[size].cap=w;
edge[size].next=head[u];
head[u]=size++;
edge[size].from=v;
edge[size].to=u;
edge[size].cap=0;
edge[size].next=head[v];
head[v]=size++;
}
int dep[maxn];
int bfs(int start,int end){
int que[maxn];
int front,rear;
MS(dep,-);
que[rear++]=start;
dep[start]=;
while(front!=rear){
int u=que[front++];
if(front==maxn)front=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>&&dep[v]==-){
dep[v]=dep[u]+;
que[rear++]=v;
if(rear>=maxn)rear=;
if(v==end)return ;//优化1 找到直接返回
}
}
}
return ; }
int dinic(int start,int end){ int res=;
int top;
int stack[maxn];//非递归 手写栈
int cur[maxn];
while(bfs(start,end)){
memcpy(cur,head,sizeof(head));//当前弧预备工作
int u=start;
top=;
while(){
if(u==end){//当找到终点的时候
int min=inf;
int loc;
for(int i=;i<top;i++){//找到路径里面最小的流量
if(min>edge[stack[i]].cap){
min=edge[stack[i]].cap;
loc=i;//记下最小流量的边 之后的点都不可能到达了
}
}
for(int i=;i<top;i++){//减流量和加反向边
edge[stack[i]].cap-=min;
edge[stack[i]^].cap+=min;
}
res+=min;
top=loc;//退栈顶到那个流量已经清零的边的起点i
u=edge[stack[top]].from; }
for(int i=cur[u];i!=-;cur[u]=i=edge[i].next)//当前弧优化如果存在以下情况的时候就可以break进行操作了
if(edge[i].cap!=&&dep[u]+==dep[edge[i].to])
break;
if(cur[u]!=-){//如果有边可以走 那么就把边和点入栈
stack[top++]=cur[u];
u=edge[cur[u]].to;
}
else {//如果从栈顶点出发找不到可以增广的路径了,那么如果栈已经空了 那可能就没有可以增广的路径了,而如果栈没有空 那么就退栈继续找
if(top==)break;
dep[u]=-;//因为从u已经找不到可以走的路径了 直接把dep[u]=-1相当于没有点可以可以通过dep[u]+1==dep[edge[i].to]的条件 也就是u以后也入不了栈了
u=edge[stack[--top]].from;
}
}
}
return res;
}
int main(){
int start,end;
int np,nc,m;
int u,v,z;
while(scanf("%d%d%d%d",&n,&np,&nc,&m)==){
init();
while(m--){
while(getchar()!='(');
scanf("%d,%d)%d",&u,&v,&z);
u++,v++;
add(u,v,z); }
while(np--){
while(getchar()!='(');
scanf("%d)%d",&u,&z);
u++;
add(,u,z);
}
while(nc--){
while(getchar()!='(');
scanf("%d)%d",&u,&v);
u++;
add(u,n+,z);
}
start=;
end=n+;
int ans=dinic(start,end);
printf("%d\n",ans);
}
return ;
}

Power Network POJ - 1459 网络流 DInic 模板的更多相关文章

  1. Power Network (poj 1459 网络流)

    Language: Default Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23407   ...

  2. Power Network POJ - 1459 [网络流模板]

    http://poj.org/problem?id=1459 嗯,网络流模板...多源点多汇点的图,超级汇点连发电厂,用户连接超级汇点 Status Accepted Time 391ms Memor ...

  3. poj 1459 Power Network : 最大网络流 dinic算法实现

    点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted:  ...

  4. Power Network - poj 1459 (最大流 Edmonds-Karp算法)

      Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A ...

  5. F - Power Network - poj 1459(简单最大流)

    题目大意:题目说了一大堆,其实都是废话......让人有些不知所云,其实就是给了一些电厂,和一些消费点,然后里面有一些路线什么的,求出消费点可以最多消费的电量是多少. 输入大意: 分析:懂了题意就是一 ...

  6. F - Power Network POJ - 1459

    题目链接:https://vjudge.net/contest/299467#problem/F 这个是一个很简单的题目,但是读入很有意思,通过这个题目,我学会了一种新的读入方式. 一个旧的是(%d, ...

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

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

  8. poj 1459(网络流)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 26688   Accepted: 13874 D ...

  9. poj 1459 网络流问题`EK

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24930   Accepted: 12986 D ...

随机推荐

  1. 【C#复习总结】探究各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字

    前言 先普及一下线程安全和类型安全 线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的 ...

  2. [原创]Sharding-Sphere之Proxy初探

    大家好,拓海(https://github.com/tuohai666)今天为大家分享Sharding-Sphere推出的重磅产品:Sharding-Proxy!在之前闪亮登场的Sharding-Sp ...

  3. 开源后的.Net 如何选择使用

     .NET是跨平台的开发栈.它有一个标准库,称为.NET Standard Library,其中包含了大量的APIs.这个标准库由各种.NET运行环境实现:.NET Framework..NET Co ...

  4. 【转】mysql热备

    mysql双机热备的实现 亲测可用

  5. Redis Sentinel 集群搭建常见注意事项

    我的配置: 1个master,1个slave,3个sentinel 搭建的过程网上已经有很多了,这里列几个重点关注: 修改sentinel.conf的protected-mode与redis.conf ...

  6. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  7. PAT L3-020 至多删三个字符

    https://pintia.cn/problem-sets/994805046380707840/problems/994805046946938880 给定一个全部由小写英文字母组成的字符串,允许 ...

  8. Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案

    C header files matching your running kernel were not found. Refer to your distribution's documentati ...

  9. java的编程习惯影响程序性能

    在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身. 养成良好的编程习惯非常重要,能够显著地提升程序性能. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时 ...

  10. 1 Servlet 简介

    1 Servlet是sun公司提供的一门用于开发动态web资源的技术.用户若用Java技术开发一个动态web资源或者网页,需要完成以下2个步骤:① 编写一个Java类,实现servlet接口② 把开发 ...