洛谷P3376 【模板】网络最大流
时间:2019-02-15
本文章向大家介绍洛谷P3376 【模板】网络最大流,主要包括洛谷P3376 【模板】网络最大流使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题地址:https://www.luogu.org/problemnew/show/P3376
题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。
输入输出格式
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出格式:
一行,包含一个正整数,即为该网络的最大流。
输入输出样例
输入样例#1:
4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40
输出样例#1:
50
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=25
对于70%的数据:N<=200,M<=1000
对于100%的数据:N<=10000,M<=100000
写给自己看的代码如下
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
struct Line{
int r, w;
Line() = default;
Line(int r, int w): r(r), w(w){ }
}line[200005];
vector<int> g[10005];
int deep[10005];
int n, m, s, t;
bool bfs()
{
memset(deep, 0, sizeof(deep));
queue<int> que;
que.push(s);
deep[s] = 1;
while(!que.empty()){
int top = que.front();
que.pop();
for(int i = 0; i < g[top].size(); i ++){
int z = g[top][i];
if(!deep[line[z].r] && line[z].w){ //通过非饱和弧记录深度
que.push(line[z].r);
deep[line[z].r] = deep[top] + 1;
if(deep[t])
return true;
}
}
}
return false;
}
int dfs(int x, int mix) //mix为当前流量
{
//cout << x << " " << mix << endl;
if(!mix || x == t){
return mix;
}
int ap = 0; //从点x最多流出量
for(int i = 0; i < g[x].size(); i ++){
int z = g[x][i];
if(deep[line[z].r] > deep[x] && line[z].w){
int p = dfs(line[z].r, min(mix, line[z].w));
ap += p;
mix -= p; //p流走了
line[z].w -= p;
line[z^1].w += p;
if(!line[z].w){ //回溯到第一个line[z].w为0的边的出发点
return ap;
}
}
}
return ap;
}
int dinic()
{
int ans = 0;
while(bfs()){
ans += dfs(s, INF);
}
return ans;
}
int main()
{
while(cin >> n >> m >> s >> t){
for(int i = 0; i < m; i ++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
//cin >> u >> v >> w;
line[i * 2] = Line(v, w);
line[i * 2 + 1] = Line(u, 0);
g[u].push_back(i * 2);
g[v].push_back(i * 2 + 1);
}
printf("%d\n", dinic());
//cout << dinic() << endl;
for(int i = 1; i <= n; i ++)
g[i].clear();
}
return 0;
}
- LSTM Networks在股票市场上的探究
- MSBuild的简单介绍与使用
- actionbar详解(二)
- actionbar完全解析(一)
- android galley实现画廊效果
- RavenDB:基于Windows/.NET平台的NoSQL数据库
- 神经网络算法交易:波动预测与定制损失函数
- 贝叶斯深度学习:桥接PyMC3和Lasagne构建层次神经网络
- How does it work in Mono's C# compiler?
- Cross-Origin Resource Sharing协议介绍
- 战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(二)
- Microsoft StreamInsight 构建物联网
- 利用 Microsoft StreamInsight 控制较大数据流
- HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 我向面试官讲解了单例模式,他对我竖起了大拇指
- 47 张图带你 MySQL 进阶!!!
- 新特性解读 | InnoDB-Cluster 扫盲-日常运维
- Laravel 框架实现无限极分类
- 这样设置IDEA,让你爽到飞起!
- 这些年,我写过的BUG(一)
- Selenium处理下拉列表
- 掌握好这几个css属性,少写100行js代码
- 计算机基础知识总结与操作系统 PDF 下载
- Kafka工作流程及文件存储机制
- JS破解初探,折腾到头秃的美拍视频采集下载
- 去哪儿景点信息爬取并使用Django框架网页展示
- Kubernetes v1.15.3 升级到 v1.18.5 心得
- 结巴分词seo应用,Python jieba库基本用法及案例参考
- nali一个可以查询IP归属和CDN的命令