怒搞一下午网络流,又去我一块心病。

从2F到SAP再到Dinic最终过掉了。

但是书上说Dinic的时间复杂度为v*v*e。感觉也应该超时的啊,但是过掉了,好诡异。

后两种算法都是在第一种的基础上进行优化。

第一种方法就是不停的寻找增广路。后两种引进了层次网络的概念。第三种又改善了寻找增广路的方法。

如今仅仅能理解到这里了。。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>#pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 6000007using namespace std;struct E
{int u,v,Max,now,next;
}edge[30000];int Top;int head[300];void Link(int u,int v,int w)
{edge[Top].u = u;edge[Top].v = v;edge[Top].Max = w;edge[Top].now = 0;edge[Top].next = head[u];head[u] = Top++;
}struct P
{int pre,now,floor;bool mark;
}sta[300];void Modify(int a,int t)
{while(t != 1){edge[sta[t].pre].now += a;t = edge[sta[t].pre].u;}
}int SAP(int s,int t,int n)
{for(int i = 1;i <= n; ++i)sta[i].mark = false;queue<int> q;q.push(s);sta[s].mark = true;sta[s].now = 2000000000;sta[s].pre = -1;while(q.empty() == false){if(sta[t].mark && sta[t].now){Modify(sta[t].now,t);return sta[t].now;}int f = q.front();q.pop();for(int p = head[f];p != -1; p = edge[p].next){if(sta[edge[p].v].mark == false && sta[edge[p].u].floor == sta[edge[p].v].floor-1 && sta[edge[p].u].floor < sta[t].floor){sta[edge[p].v].now = min(sta[f].now,edge[p].Max - edge[p].now);if(sta[edge[p].v].now == 0)continue;sta[edge[p].v].pre = p;//记录边的存储位置sta[edge[p].v].mark = true;q.push(edge[p].v);}}}return 0;
}void Updata_Floor(int s,int t,int n)
{queue<int> q;for(int i = 0;i <= n; ++i)sta[i].mark = false,sta[i].floor = n;q.push(s);sta[s].mark = true;sta[s].floor = 1;while(q.empty() == false){int f = q.front();q.pop();if(sta[t].mark && sta[t].floor <= sta[f].floor)return ;for(int p = head[f];p != -1; p = edge[p].next){if(sta[edge[p].v].mark == false && edge[p].now < edge[p].Max){sta[edge[p].v].mark = true;sta[edge[p].v].floor = sta[f].floor + 1;q.push(edge[p].v);}}}
}int dfs(int s,int t,int a)
{if(s == t)return a;int f = 0;for(int p = head[s],temp = 0;p != -1; p = edge[p].next){if((sta[edge[p].v].floor < sta[t].floor || edge[p].v == t) && sta[edge[p].v].floor == sta[s].floor+1 && edge[p].now < edge[p].Max){temp = dfs(edge[p].v,t,min(a-f,edge[p].Max-edge[p].now));edge[p].now += temp;f += temp;}}return f;
}int Dinic(int s,int t,int n)
{return dfs(s,t,200000000);
}int Cal_Max_Flow(int s,int t,int n)
{int temp,f = 0;do{Updata_Floor(s,t,n);//temp = SAP(s,t,n);temp = Dinic(s,t,n);f += temp;}while(temp);return f;
}int main()
{char s[50];int i,n,np,nc,m,u,v,w;while(scanf("%d %d %d %d",&n,&np,&nc,&m) != EOF){memset(head,-1,sizeof(head));Top = 0;for(i = 0;i < m; ++i){scanf("%s",s);sscanf(s,"(%d,%d)%d",&u,&v,&w);Link(u+2,v+2,w);}for(i = 0;i < np; ++i){scanf("%s",s);sscanf(s,"(%d)%d",&u,&w);Link(1,u+2,w);}for(i = 0;i < nc; ++i){scanf("%s",s);sscanf(s,"(%d)%d",&u,&w);Link(u+2,n+2,w);}printf("%d\n",Cal_Max_Flow(1,n+2,n+2));}return 0;
}

转载于:https://www.cnblogs.com/mqxnongmin/p/10966684.html

初涉网络流 POJ 1459 Power Network相关推荐

  1. POJ 1459 -- Power Network(最大流, 建图)

    题目链接 Description A power network consists of nodes (power stations, consumers and dispatchers) conne ...

  2. POJ - 1459 Power Network(网络流-最大流)

    题目链接:点击查看 题目大意:题意属实恶心,借用别的大佬的题意: 题目描述 一个电网包含一些结点(电站.消费者.调度站),这些结点通过电线连接.每个结点 uu 可能被供给 s(u) 的电能, s(u) ...

  3. POJ 1459 Power Network

    题意:有n个据点,np个发电机.nc个用户,m条电线.给出发电机.用户.电线的电流限制,求最大网络电流. 这是带节点的网络流.事实上和原来没什么差别,仅仅要在前后都添加一个据点,在这里我加了0和n+1 ...

  4. Poj(1459),最大流,EK算法

    题目链接:http://poj.org/problem?id=1459 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Su ...

  5. 【POJ - 1459】Power Network(网络流最大流,建图)

    题干: A power network consists of nodes (power stations, consumers and dispatchers) connected by power ...

  6. Power Network POJ - 1459(EK算法模板+详解)

    题意: 总共有a个节点,其中有发电站b个.用户c个和调度器a-b-c个三种节点,每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有d条有向边,边有一个最大的流量代表,最多可以流出这么多电,现 ...

  7. [Poj 1459] 网络流(一) {基本概念与算法}

    { 凸包的内容还欠整理 先来侃侃一个月以前就想写写的网络流 本文介绍网络流 网络流的算法 及其应用 这些问题没事想想还是很有意思的 } ================================ ...

  8. POJ1459 Power Network —— 最大流

    题目链接:https://vjudge.net/problem/POJ-1459 Power Network Time Limit: 2000MS   Memory Limit: 32768K Tot ...

  9. 第二十七课:Power Network Synthesis(PNS)

    总览 前面完成了IO pad 及macro cell的placement及congestion的消除,本节课开始说明PG network的放置并满足congestion与timing delay: 整 ...

最新文章

  1. AI还原宋明清三朝皇帝,还找到了最匹配的明星脸,网友:四大美女安排上
  2. for循环一定要指定键么 vue_vue的for循环使用方法
  3. python双循环zip_Python 并行遍历zip()函数使用方法
  4. 综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?
  5. 前端学习(1728):前端系列javascript之状态栏分析
  6. OpenFileDialog 打开文件对话框
  7. AWS拓展中国合作伙伴生态 加速企业数字化转型进程
  8. java嵌套循环语句_Java学习笔记(七) 循环语句
  9. 44 SD配置-销售凭证设置-定义状态参数文件
  10. 获知哪个函数调用了本函数及它的类名
  11. mysql using btree_mysql 索引中的USING BTREE 的意义
  12. JAVA遇见HTML——JSP篇:JSP内置对象(上)
  13. 后缀自动机(学习笔记)
  14. Automatic Brain Tumor Segmentation using Cascaded Anisotropic Convolutional Neural Networks
  15. Android开发中的单元测试
  16. de4dot 反混淆工具使用
  17. php curl jsonrpc,JsonRPC: Lightweight Json-RPC 2.0 client/server in PHP extension
  18. android程序表白,打造一款浪漫的Android表白程序
  19. 浅析Minecraft直播弹幕模组BakaDanmaku源码
  20. 南大衣哥、北袁长标,恭喜谷传民新歌准备报送央视春晚

热门文章

  1. AirPrint: 无交互的后台打印实现(Print without UI,iOS8+)
  2. TCP/IP协议族-----10、搬家IP
  3. Debian下搭建Samba CTDB集群。
  4. 使用SC命令使用(转)
  5. ***学习笔记教程五:***技术
  6. 基于Sbo SDK的Add-on插件开发实例
  7. AIO+BIO+NIO+同步+异步+阻塞+非阻塞
  8. 37 Reasons why your Neural Network is not working
  9. OpenCV学习笔记-关于使用Mat.at(i,j) = int 语法报错
  10. 计算机中管理方法科学化的重要性,浅论档案科学化管理的重要性