网络流——poj1273(入门)
题目链接:排水沟
题意:现有n个排水沟和m个点(其中1是源点,m是汇点),给定n个排水沟所连接的点,求从源点到汇点的最大流量。
【EK解法】
- #include <algorithm>
- #include <queue>
- #include <string.h>
- using namespace std;
- int const MAX = ;
- int const inf = 0x3f3f3f3f;
- int c[MAX][MAX];//c[u][v]保存容量
- int f[MAX][MAX];//f[u][v]保存当前流量
- int a[MAX];// a数组在每趟bfs中找到最小路径中最小残余流量的,a数组使个递推数组,a[v]的意思是从源点s到点v的最小残余流量
- int p[MAX];//保存前一个点
- int n, m;
- int bfs(int s, int t)
- {
- queue<int> q;
- int flow = ;
- while(!q.empty()) q.pop();
- memset(f, , sizeof(f));
- while(){
- memset(a, , sizeof(a));
- a[s] = inf;//将起始点的最小残余量设为最大
- q.push(s);
- while(!q.empty()){//bfs找到一条最短路,这里的边不代表距离,可以看作每两个点都是单位距离的
- int u;
- u = q.front();
- q.pop();
- for(int v = ; v <= m; v++){//枚举所有点v <u,v>
- if(!a[v] && c[u][v] > f[u][v]){//a[]可以代替vis[],来判断这个点是否已经遍历过,后面那个条件更是起了关键作用,很巧妙
- p[v] = u;
- q.push(v);
- a[v] = min(a[u], c[u][v] - f[u][v]);//递推
- }
- }
- }
- if(!a[t]) break;//直到最小残余流量为0时,退出
- for(int u = t; u != s; u = p[u]){
- f[p[u]][u] += a[t];
- f[u][p[u]] -= a[t];
- }
- flow += a[t];
- }
- return flow;
- }
- int main()
- {
- while(~scanf("%d %d", &n, &m)){
- memset(c, , sizeof(c));
- memset(p, , sizeof(p));
- for(int i = ; i <= n; i++){
- int u, v, w;
- scanf("%d %d %d", &u, &v, &w);
- c[u][v] += w;
- }
- printf("%d\n", bfs(, m));
- }
- return ;
- }
EK解法
【Dinic解法】
- #include <cstdio>
- #include <string.h>
- #include <queue>
- using namespace std;
- int const inf = 0x3f3f3f3f;
- int const MAX = ;
- int n, m;
- int c[MAX][MAX], dep[MAX];//dep[MAX]代表当前层数
- int bfs(int s, int t)//重新建图,按层次建图
- {
- queue<int> q;
- while(!q.empty())
- q.pop();
- memset(dep, -, sizeof(dep));
- dep[s] = ;
- q.push(s);
- while(!q.empty()){
- int u = q.front();
- q.pop();
- for(int v = ; v <= m; v++){
- if(c[u][v] > && dep[v] == -){//如果可以到达且还没有访问,可以到达的条件是剩余容量大于0,没有访问的条件是当前层数还未知
- dep[v] = dep[u] + ;
- q.push(v);
- }
- }
- }
- return dep[t] != -;
- }
- int dfs(int u, int mi, int t)//查找路径上的最小流量
- {
- if(u == t)
- return mi;
- int tmp;
- for(int v = ; v <= m; v++){
- if(c[u][v] > && dep[v] == dep[u] + && (tmp = dfs(v, min(mi, c[u][v]), t))){
- c[u][v] -= tmp;
- c[v][u] += tmp;
- return tmp;
- }
- }
- return ;
- }
- int dinic()
- {
- int ans = , tmp;
- while(bfs(, m)){
- while(){
- tmp = dfs(, inf, m);
- if(tmp == )
- break;
- ans += tmp;
- }
- }
- return ans;
- }
- int main()
- {
- while(~scanf("%d %d", &n, &m)){
- memset(c, , sizeof(c));
- int u, v, w;
- while(n--){
- scanf("%d %d %d", &u, &v, &w);
- c[u][v] += w;
- }
- printf("%d\n", dinic());
- }
- return ;
- }
Dinic解法
网络流——poj1273(入门)的更多相关文章
- HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [补档]暑假集训D6总结
考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ ...
- ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)
基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...
- poj1273 网络流入门题 dinic算法解决,可作模板使用
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62078 Accepted: 2384 ...
- 网络流入门—用于最大流的Dinic算法
"网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...
- nyoj_323:Drainage Ditches(网络流入门)
题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...
- 网络流入门-POJ1459PowerNetwork-Dinic模板
(我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!) (Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~ 这是本人网络流入门第二题,不知道怎 ...
- Tile Cut~网络流入门题
Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...
随机推荐
- mac install PyQt5
1. install brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...
- vue2高仿饿了么app
Github地址: https://github.com/ccyinghua/appEleme-project 一.构建项目所用: vue init webpack appEleme-project ...
- Ehcache基于java API实现
上代码: package com.utils.cacheutils; import com.situopenapi.constant.EhcacheConstants; import com.situ ...
- http状态码(status_codes)
首先:1XX 接受的请求正在处理,2XX请求正常处理完毕,3XX需要进行附加操作以完成请求(重定向?),4XX服务器无法处理请求(也就是客户端请求错误),5XX服务器处理请求出错. 当然不仅仅是一张图 ...
- cors(Cross-origin resource sharing)跨域资源共享
阮一峰老师的文章(http://www.ruanyifeng.com/blog/2016/04/cors.html)跨域资源共享详解和https://developer.mozilla.org/zh- ...
- 简易的vuex用法
vuex是vue中用于管理全局状态的一个组件,用于不同组件之间的通信,下面将介绍它的简单用法 首先安装vue与vuex npm install vue npm install vuex --save ...
- h5移动端页面meta标签
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- laravel路由组+中间件
在rotues中的web.php
- python中 列表常用的操作
列表可以装大量的数据,不限制数据类型,表示方式:[]:列表中的元素用逗号隔开. lst = [] #定义一个空列表 lst = ["Tanxu",18,"女", ...
- dz论坛Discuz_X3.4最新网站漏洞
近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...