题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式
第一行包含四个正整数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. Redis学习笔记(七) 数据库

    Redis 服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDB: struct redisServer{ //一个数组保存着服务器中的 ...

  2. Mysql 常用函数(19)- mod 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html mod 的作用 求余数,和%一样 mod的语法格式 ...

  3. JVM系列(2)-GC

    1.什么是GC? 大白话说就是垃圾回收机制,内存空间是有限的,你创建的每个对象和变量都会占据内存,gc做的就是对象清除将内存释放出来,这就是GC要做的事. 2.需要GC的区域 说起垃圾回收的场所,了解 ...

  4. 手把手教你用Python网络爬虫获取网易云音乐歌曲

    前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...

  5. EOS基础全家桶(十二)智能合约IDE-VSCode

    简介 上一篇我们介绍了EOS的专用IDE工具EOS Studio,该工具的优势是简单,易上手,但是灵活性低,且对系统资源开销大,依赖多,容易出现功能异常.那么我们开发人员最容易使用的,可能还是深度定制 ...

  6. 9.5 Go 依赖管理

    9.5 Go 依赖管理 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息. A. 所有的第三方包都放在$GOPATH的src目录下. B. 如果不同程序依赖的版本不一样 ...

  7. Linux系统rabbitmq安装

    rabbitmq消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递.消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管 ...

  8. Vue零基础入门记录

    在2020年这个开局不利的年份毕业,实习工作都很难得.最近来到一家单位,为了减小开支实习生过来了的话前端后端都要写.用Vue和ElementUI做界面.以前的前端vue了解还停留在new一个Vue实例 ...

  9. 客服端负载均衡:Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具.服务间的调用,API网关的请求转发都是通过Ribbon实现的. 在微服务架构中使用客户端负载均衡需要两步: (1) ...

  10. Python-pygame案例AI贪吃蛇

    # coding: utf-8 import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColour = pygam ...