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 ...
随机推荐
- Python中for循环搭配else的陷阱
假设有如下代码: for i in range(10): if i == 5: print 'found it! i = %s' % i else: print 'not found it ...' ...
- 大连CCPC D - A Simple Math Problem
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> ...
- E. Superhero Battle
链接 [https://codeforces.com/contest/1141/problem/E] 题意 怪物开始的生命值,然后第i分钟生命值的变化 问什么时候怪物生命值为非正 分析 有一个巨大的坑 ...
- OSS网页上传和断点续传(STSToken篇)
云账号AccessKey拥有所有API访问权限,在客户端不要直接使用,会泄露ak信息,造成安全问题.所以使用STS方式(临时账号权限)给客户端授权. C#版获取STSToken 一.下载阿里SDK(a ...
- 关于php,python,javascript文件或者模块导入引入的区别和联系
前言: 我们经常看到编程语言之间,文件或者模块的引来引去的,但是他们在各个编程语言之间有什么区别和联系呢? 1.javascript (1).全局引入方式: <script src='xxxxx ...
- 福州大学软件工程1816 | W班 第10次作业[软件工程实践总结]
作业链接 个人作业--软件工程实践总结 评分细则 本次由五个问题(每个十分)+创意照片(五分)+附加题(十分)组成 评分统计图 千帆竞发图 汇总成绩排名链接 汇总链接
- Golang 字符串操作--使用strings、strconv包
strings包 package main import ( "fmt" "strings" ) func main() { //func Count(s, s ...
- oracle一些单记录函数
单记录函数 1.0 NVL() 作用:从两个表达式返回一个非NULL值 用法:NVL(表达式1, 表达式2) 如果表达式1的结果不为NULL,返回表达式1的结果:如果表达式1的结果为NULL,返回表达 ...
- 把composer的源切换为 国际的源
把composer的源切换为 国际的源:composer config -g repo.packagist composer https://packagist.org
- js怎么能取得多选下拉框选中的多个值?
方法:获取多选下拉框对象数组→循环判断option选项的selected属性(true为选中,false为未选中)→使用value属性取出选中项的值.实例演示如下: 1.HTML结构 1 2 3 4 ...