luogup3376网络流

简介: luogup3376网络流

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。


输入输出格式

输入格式:

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。


接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)


输出格式:

一行,包含一个正整数,即为该网络的最大流。

Dinic(当前点优化 + 当前边优化)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
const int maxm = 1e6 + 5;
const int inf = 2e9 + 5;
int cur[maxn];
int head[maxn], dep[maxn];
int tot, n, m;
struct Edge {
    int u, v, w, next;
}edge[maxm];
inline void init() {
    memset(head, -1, sizeof(head));
    tot = 1;
}
inline void add(int u, int v, int w) {
    edge[++tot].u = u; edge[tot].v = v; edge[tot].w = w;
    edge[tot].next = head[u];
    head[u] = tot;
}
inline int bfs(int s, int t) {
    for(int i = 0; i <= n; i++) {
        dep[i] = inf;
    }
    queue<int> q;
    q.push(s);
    dep[s] = 0;
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        for(int i = head[u]; i != -1; i = edge[i].next) {
            int v = edge[i].v;
            if(edge[i].w > 0 && dep[u] + 1 < dep[v]) {
                dep[v] = dep[u] + 1;
                if(v == t) return 1; //当前点优化
                q.push(v);
            }
        }
    }
    return dep[t] != inf;
}
inline int dfs(int u, int t, int flow) {
    if(u == t) {
        return flow;
    }   
    int res = 0;
    for(int i = cur[u]; i != -1; i = edge[i].next) {
        cur[u] = i; //当前边优化
        int w = edge[i].w;
        int v = edge[i].v;
        if(w <= 0 || dep[v] != dep[u] + 1) {
            continue;
        }
        res = dfs(v, t, min(flow, w));
        if(res > 0) {
            edge[i].w -= res;
            edge[i ^ 1].w += res;
            return res;
        }
    }
    return -1;
}
inline int Dinic(int s, int t) {
    int ans = 0, ret;
    while(bfs(s, t)) {
        for(int i = 0; i <= n; i++) {
            cur[i] = head[i];
        }
        while((ret = dfs(s, t, inf)) != -1) {
            ans += ret;
        }
    }
    return ans;
}
inline int read() {
    int ans = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9') {
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans;
}
int main() {
    int u, v, w, s, t;
    init();
    n = read(); m = read(); s = read(); t = read();
    for(int i = 1; i <= m; i++) {
        u = read(); v = read(); w = read();
        add(u, v, w);
        add(v, u, 0);
    }
    cout << Dinic(s, t) << endl;
    return 0;
}
相关文章
|
5月前
网络流理解与模板
网络流理解与模板
32 0
|
9天前
|
监控 Java Linux
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
本文是关于如何在Jetson设备上使用CSI摄像头实现RTSP流传输的详细教程,包括安装依赖、编译gst-rtsp-server、测试、源代码介绍以及如何动态获取多路流的RTSP服务器。
50 2
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
|
4月前
|
缓存
计算机网络——数据链路层-可靠传输的实现机制:回退N帧协议GBN(无差错情况、累积确认、有差错情况、发送窗口尺寸)
计算机网络——数据链路层-可靠传输的实现机制:回退N帧协议GBN(无差错情况、累积确认、有差错情况、发送窗口尺寸)
95 0
计算机网络——数据链路层-可靠传输的实现机制:回退N帧协议GBN(无差错情况、累积确认、有差错情况、发送窗口尺寸)
|
11月前
|
存储 网络协议 Linux
网络缓冲区
网络缓冲区
64 0
|
存储 编解码 网络协议
音视频基础(网络传输): RTMP封包
RTMP 概念 与 HTTP(超文本传输协议)同样是一个基于 TCP 的 Real Time Messaging Protocol(实时消息传输协议)。由 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应用于直播 领域。HTTP 默认端口为 80,RTMP 则为 1935。
249 0
音视频基础(网络传输): RTMP封包
|
存储 编解码 网络架构
传输时延和传播时延(补充:频段,信道带宽,数据速率的区别,以及帧大小和帧长)
传输时延和传播时延(补充:频段,信道带宽,数据速率的区别,以及帧大小和帧长)
864 0
|
存储 网络协议 数据处理
协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)
协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)
363 1
|
监控 Android开发 开发者
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
485 0
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
|
SQL
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(二)
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(二)
387 0
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(一)
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(一)
319 0