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;
}
相关文章
|
7月前
网络流理解与模板
网络流理解与模板
36 0
|
3月前
|
监控 网络协议 安全
|
4月前
|
存储 网络架构
网络速率与下载速率
【8月更文挑战第8天】
256 1
网络速率与下载速率
|
7月前
|
网络协议 iOS开发 MacOS
LabVIEW在快速传输速率下丢失UDP数据包
LabVIEW在快速传输速率下丢失UDP数据包
93 0
|
存储 网络协议 Linux
网络缓冲区
网络缓冲区
76 0
|
存储 编解码 网络协议
音视频基础(网络传输): RTMP封包
RTMP 概念 与 HTTP(超文本传输协议)同样是一个基于 TCP 的 Real Time Messaging Protocol(实时消息传输协议)。由 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应用于直播 领域。HTTP 默认端口为 80,RTMP 则为 1935。
268 0
音视频基础(网络传输): RTMP封包
|
存储 编解码 网络架构
传输时延和传播时延(补充:频段,信道带宽,数据速率的区别,以及帧大小和帧长)
传输时延和传播时延(补充:频段,信道带宽,数据速率的区别,以及帧大小和帧长)
937 0
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(一)
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(一)
334 0
|
SQL
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(二)
【计算机网络】数据链路层 : 停止-等待协议 ( 无差错情况 | 有差错情况 | 帧丢失 | 帧出错 | ACK 确认帧丢失 | ACK 确认帧延迟 | 信道利用率公式 | 信道利用率计算 )★(二)
440 0
|
存储 Java Unix
内存流与管道流 | 学习笔记
快速学习内存流与管道流。
207 0