Power Network POJ - 1459 网络流 DInic 模板
#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 模板的更多相关文章
- Power Network (poj 1459 网络流)
Language: Default Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 23407 ...
- Power Network POJ - 1459 [网络流模板]
http://poj.org/problem?id=1459 嗯,网络流模板...多源点多汇点的图,超级汇点连发电厂,用户连接超级汇点 Status Accepted Time 391ms Memor ...
- poj 1459 Power Network : 最大网络流 dinic算法实现
点击打开链接 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20903 Accepted: ...
- Power Network - poj 1459 (最大流 Edmonds-Karp算法)
Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24788 Accepted: 12922 Description A ...
- F - Power Network - poj 1459(简单最大流)
题目大意:题目说了一大堆,其实都是废话......让人有些不知所云,其实就是给了一些电厂,和一些消费点,然后里面有一些路线什么的,求出消费点可以最多消费的电量是多少. 输入大意: 分析:懂了题意就是一 ...
- F - Power Network POJ - 1459
题目链接:https://vjudge.net/contest/299467#problem/F 这个是一个很简单的题目,但是读入很有意思,通过这个题目,我学会了一种新的读入方式. 一个旧的是(%d, ...
- POJ 1273 Drainage Ditches (网络流Dinic模板)
Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...
- poj 1459(网络流)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 26688 Accepted: 13874 D ...
- poj 1459 网络流问题`EK
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24930 Accepted: 12986 D ...
随机推荐
- Java基础之数据比较Integer、Short、int、short
基础很重要,基础很重要,基础很重要.重要的事情说三遍,. 今天聊一聊Java的数据比较,这个范围比较大,基础类型的比较.引用类型的比较. 前提: 1.Java和c#都提供自动装箱和自动拆箱操作,何为自 ...
- Ubuntu 18.04 根目录为啥只有 4G 大小
其实准确点儿的描述应该是:Ubuntu Server 18.04 ,设置 LVM,安装完成后根目录的容量为什么只有 4G?只有 Server 版有问题,Desktop 版没有问题,Ubuntu 16. ...
- 009-定时关闭弹出广告窗口 By BoAi 20190414
;~ 定时关闭弹出广告窗口 By BoAi 20190414 ; ### 参数设置段 ######################################SingleInstance,forc ...
- Python入门-Hello Word
1.python语言介绍 Python创始人:Guido Van Rossum 2.python是一种解释型.动态类型计算机程序设计语言. 解释型:程序无需编译成二进制代码,而是在执行时对语句一条一条 ...
- elasticSearch聚合sum查询
有时需要统计一段时间内,订单的总金额.类似于sql的sum,针对某一字段求和.这就涉及到es的聚合查询,来看看用spring-data-elasticSearch怎么写: QueryBuilder ...
- 正则表达式验证input文本框
方便以后的查找,直接copy代码在这里了. eg: //公司邮箱验证 if ($("#Email").val() != "") { var myreg = /^ ...
- ~/.bashrc与/etc/profile的区别
~/.bashrc:该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取. /etc/profile中设定的变量(全局)的可以作用于任 ...
- babel(一)
一.babel npm babel src/index.js -d lib 二.@babel/core @babel/cli @babel/core 转换语法核心 @babel/cli 执行 ...
- 使用node操作mongodb
let mongodb = require('mongodb'); let MongodbClient = mongodb.MongoClient; MongodbClient.connect('mo ...
- 本地数据访问时出现跨域问题Cross origin requests are only supported for protocol schemes: ……
从桌面找到Chrome图标,右键属性,快捷方式,起始位置(安装路径) 注:在cmd中访问Program Files文件的方法 %ProgramFiles%=C:\Program Files %Prog ...