题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式
第一行包含四个正整数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. 通过PAML中的CODEML模块计算dnds的过程以及踩坑

    最近帮女朋友做毕业设计的时候用到了 PAML这个软件的codeml功能,发现网上相关的资料很少,于是把自己踩的一些坑分享一下,希望能帮到其他有相同困难的人 一.下载与安装 PAML软件下载地址 htt ...

  2. 洛谷P1027题解

    https://www.luogu.org/problem/P1027传送到题目 首先,让我骂一句那没事找事的Car还取一个那么奇怪的名字看到这个题,恕我直言,我们明显可以看出这是一道图的最短路问题. ...

  3. tcmalloc安装

    环境是centos 6 (64位) yum list libunwind-devel  (epel 源) wget https://gperftools.googlecode.com/files/gp ...

  4. 「雕爷学编程」Arduino动手做(11)——金属触摸模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  5. vue在钩子中引用方法不成功

    在组建创建成功后调用methods里的方法fn1,失败,提示not a function: created(){ getData(){} } solution: created(){ this.get ...

  6. 对CSS3中的transform:Matrix()矩阵的一些理解

    只要有CSS基础的人肯定都知道,我们可以通过transform中的translate,scale,rotate,skew这些方法来控制元素的平移,缩放,旋转,斜切,其实这些方法呢都是为了便于开发者使用 ...

  7. SpringBoot教程——检视阅读

    SpringBoot教程--检视阅读 参考 SpringBoot教程--一点--蓝本--springboot2.1.1 SpringBoot教程--易百--springboo2.0.5.RELEASE ...

  8. jQuery学习的几个不是问题的问题

    原文在我的GitHubhttps://www.sogeisetsugo.tk/myBlog/jQuery学习的几个不是问题的问题

  9. CSS类与选择器【转】http://www.cnblogs.com/duanhuajian/archive/2012/12/17/2821524.html

    1.在 HTML 中,一个 class 值中可能包含一个词列表,各个词之间用空格分隔.例如,如果希望将一个特定的元素同时标记为重要(important)和警告(warning),就可以写作(这两个词的 ...

  10. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...