题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式
第一行包含四个正整数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 样例说明: 题目中存在3条路径: 4-->2-->3,该路线可通过20的流量 4-->3,可通过20的流量 4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量) 故流量总计20+20+10=50。输出50。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer; public class Main {
public static class node{ //存边
private int to;
private int next;
private int v; public node(){ }
}
public static class pre{ //记录路径
private int e; //该边的编号
private int b; //该边的去向
public pre(){ }
public pre(int b,int e){
this.b=b;
this.e=e;
}
} static int cnt=0,head[];
static node a[];
static pre pre[];
static boolean vis[];
static int n,m,s,t;
public static void main(String[] args) {
FastScanner fs = new FastScanner();
n=fs.nextInt(); //源点总数
m=fs.nextInt(); //边的数量
s =fs.nextInt(); //起点
t=fs.nextInt(); //终点
a=new node[2*(m+1)];
head=new int[n+1];
for (int i = 0; i <=n; i++) {
head[i]=-1;
}
for (int i = 0; i <m; i++) { //存数据
int x=fs.nextInt();
int y=fs.nextInt();
int v=fs.nextInt();
add(x,y,v);
add(y,x,0);
}
System.out.println(ek()); }
public static void add(int x,int y,int v){ //前向星存
a[cnt]=new node();
a[cnt].to=y;
a[cnt].v=v;
a[cnt].next=head[x];
head[x]=cnt++;
}
public static boolean bfs(){ //寻找是否有增广路
vis=new boolean[n+1]; //标记访问,防止重复访问
pre=new pre[n+1]; //初始化记录路径
Queue<Integer> d=new LinkedList();
vis[s]=true;
d.offer(s);
while(!d.isEmpty()){
int v=d.poll();
for(int u=head[v];;u=a[u].next){ //搜寻该点所有的边
if(u==-1)break; //到头了就结束
int f=a[u].to;
if(!vis[f]&&a[u].v>0){ //查看是否访问和是否为可行流
vis[f]=true;
pre[f]=new pre(v,u); //标记路径,后面好更新
if(f==t)return true;
d.offer(f);
}
}
}
return false;
}
public static int ek(){
int ans=0;
while(bfs()){
int min=Integer.MAX_VALUE;
for (int i =t; i!=s; i=pre[i].b) { //寻找这条路可流入量
min=Math.min(min,a[pre[i].e].v);
}
for (int i =t; i!=s; i=pre[i].b) { //更新
if(pre[i].e%2!=0){ //该边减,对应的相反边加
a[pre[i].e].v-=min;
a[pre[i].e-1].v+=min;
}else{
a[pre[i].e].v-=min;
a[pre[i].e+1].v+=min;
}
}
ans+=min; //流入量
}
return ans;
}
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
} public String nextToken() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
} public int nextInt() {
return Integer.valueOf(nextToken());
}
}

java实现洛谷P3376【模板】网络最大流的更多相关文章

  1. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  2. P3376 [模板] 网络最大流

    https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...

  3. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

  4. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  5. 洛谷 P1546 最短网络 Agri-Net

    题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...

  6. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 洛谷 P3376 【【模板】网络最大流】

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui. ...

  9. 洛谷 P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

随机推荐

  1. [hdu5255]枚举

    思路:这题与csu1392题目类似,方法类似.枚举最高位,最低位和中间数字的长度,然后列等式,计算中间的数字,看长度是不是跟枚举的一致,需要注意的是中间数字可以有前导0,如果根据等式算出来的中间数字为 ...

  2. Zookeeper入门一篇就够了

    谈点分布式 什么是分布式呢? 起初,我们的应用流量比较小,所有东西全部部署在一个服务器,比如全部丢给一个tomcat来处理,顶多做一个tomcat的多节点部署多分,再挂一台Nginx做一下负载均衡就O ...

  3. linux磁盘已满,查看哪个文件占用多

    1.使用df -h查看磁盘空间占用情况 2.使用sudo du -s -h /* | sort -nr命令查看那个目录占用空间大 3.然后那个目录占用多 再通过sudo du -s -h /var/* ...

  4. 用项目强化你的webpack

    用你的webpack实现vue-cli 本文围绕前端工程化,用webpack从零搭建一个完整项目的过程 本文核心知识点: webpack的使用 vue组件化思想 Element-UI的使用 别走别走, ...

  5. 案例 (一)如何把python项目部署到linux服务器上

      一.背景 用Python写了个脚本,需要部署到Linux环境的服务器上,由于服务器linux系统(centos,redhat等)自带的是python2,现在的python萌新都是从python3开 ...

  6. vue 细节注意

    *只有vm.$data这些被代理的属性是响应的,能够重新渲染视图 *注意,不要在实例属性或者回调函数中(如 vm.$watch('a', newVal => this.myMethod()))使 ...

  7. django中ckeditor富文本编辑器使用

    1.安装模块 (pillow是python的一个图像处理库) pip install django-ckeditor pip install pillow 2.编辑seetings.py配置文件 IN ...

  8. Appium自动化(13) - 详解 Keyboard 类里的方法和源码分析

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 Keyboard  类在 a ...

  9. SecureCRT 简单运用

    1.想要从本地电脑将文件通过secureCRT传输到远程服务器如下目录 2.在SecureCRT界面中使用快捷键[Alt+P] 打开了SFTP的界面 3.找到你要传的文件的地址[E:\a.zip] 4 ...

  10. Linux的运行等级与目标

    在老的 Linux 发行版本中,系统运行分成不同的运行级别(run level),不同的级别所启动的服务搭配有所不同.较新的 Linux 发行版本,比如 CentOS 7+,已经将运行级别替换成另一个 ...