【网络流各种模板】

网络流模板-------最大流模板 网络流模板 一.EK算法 优点:模板简单,使用方便 缺点:时间复杂度较高 存图:用邻接矩阵存图 算法详解 //EK算法模板(s为源点,t为汇点,函数返回值为最大流) //e为邻接矩阵 //p储存路径,a用来计算路径 int EK(int s,int t) { queue q; int p[MAXN*2],a[MAXN*2]; int f=0; 阅读详情

EK 复杂度O(V*E*E)

#define N 204  
  
int c[N][N];//边容量  
int f[N][N];//边实际流量  
int pre[N];//记录增广路径  
int res[N];//残余网络  
queue<int> qq;  
void init(){  
    while(!qq.empty())qq.pop();  
    memset(c,0,sizeof(c));  
    memset(f,0,sizeof(f));  
}  
int EK(int s,int t){  
    int i,j;  
    int ans=0;  
    while(1){  
        memset(res,0,sizeof(res));  
        res[s] = MAX;//源点的残留网络要置为无限大!否则下面找增广路出错  
        pre[s] = -1;  
        qq.push(s);  
        //bfs找增广路径  
        while(!qq.empty()){  
            int x = qq.front();  
            qq.pop();  
            for(i=1;i<=t;i++){  
                if(!res[i] && f[x][i] < c[x][i]){  
                    qq.push(i);  
                    pre[i] = x;  
                    res[i] = min(c[x][i] - f[x][i], res[x]);//这里类似dp,如果有增广路,那么res[t]就是增广路的最小权  
                }  
            }  
        }  
        if(res[t]==0)break;//找不到增广路就退出  
        int k = t;  
        while(pre[k]!=-1){  
            f[pre[k]][k] += res[t];//正向边加上新的流量  
            f[k][pre[k]] -= res[t];//反向边要减去新的流量,反向边的作用是给程序一个后悔的机会  
            k = pre[k];  
        }  
        ans += res[t];  
    }  
    return ans;  
}  

Dinic递归(推荐)


#define M 400  
  
struct node {  
    int u, v, next, cap;  
} edge[M*M];  
int next[M], head[M], layer[M], Q[M * 2], mark[M];  
int ecnt;  
void init(){  
    ecnt= 0;  
    memset(head,-1,sizeof(head));  
}  
void add(int u, int v, int c) {  
    edge[ecnt].u = u;  
    edge[ecnt].v = v;  
    edge[ecnt].cap = c;  
    edge[ecnt].next = head[u];  
    head[u] = ecnt++;  
  
    edge[ecnt].u = v;  
    edge[ecnt].v = u;  
    edge[ecnt].cap = 0;  
    edge[ecnt].next = head[v];  
    head[v] = ecnt++;  
}  
  
bool BFS(int begin, int end) {  
    int i, l, h, k, y;  
    for (i = 0; i <= end; i++) layer[i] = -1;  
    layer[begin] = 0;  
    l = h = 0;  
    Q[l++] = begin;  
    while (h < l) {  
        k = Q[h++];  
        for (i = head[k]; i != -1; i = edge[i].next) {  
            y = edge[i].v;  
            if (edge[i].cap > 0 && layer[y] == -1) {  
                layer[y] = layer[k] + 1;  
                if (y == end)  
                    return true;  
                Q[l++] = y;  
            }  
        }  
    }  
    return false;  
}  
  
int DFS(int x, int exp, int end) {  
    mark[x] = 1;  
    if (x == end)return exp;  
    int y, temp, i;  
    for (i = next[x]; i != -1; i = edge[i].next, next[x] = i) {  
        y = edge[i].v;  
        if (edge[i].cap > 0 && layer[y] == layer[x] + 1 && !mark[y]) {  
            if ((temp = (DFS(y, min(exp, edge[i].cap), end))) > 0) {  
                edge[i].cap -= temp;//流完后正向流表示剩余流量  
                edge[i^1].cap += temp;//流完后反向流表示正向流的流量  
                return temp;  
            }  
        }  
    }  
    return 0;  
}  
  
int Dinic_flow(int begin, int end) {  
    int i, ans = 0, flow;  
    while (BFS(begin, end)) {  
        for (i = 0; i <= end; i++)next[i] = head[i];  
        while (true) {  
            for (i = 0; i <= end; i++) mark[i] = 0;  
            flow = DFS(begin, INT_MAX, end);  
            if (flow == 0)break;  
            ans += flow;  
        }  
    }  
    return ans;  
}  


Dinic非递归 复杂度O(V^2*E)

#define N 20100
#define sta que
//静态邻接表
int level[N];
int p[N],p1[N];
int ecnt;
int que[N];
int n,m;

struct edge{
    int v,next;
    int c;
}e[900000];
void init(){
    ecnt = 0;
    memset(p,-1,sizeof(p));
}
void insert(int u,int v,int c,int w){
    e[ecnt].v = v;
    e[ecnt].c = c;
    e[ecnt].next = p[u];
    p[u] = ecnt++;
    e[ecnt].v = u;
    e[ecnt].c = w;
    e[ecnt].next = p[v];
    p[v] = ecnt++;
}
int Dinic(int st,int ed){
    int ans = 0;
    int i,u,v,c;
    int head,rear,top;
    while(1){//重建层次图
        memset(level,0,sizeof(level));
        head = rear = 0;
        level[st]=1;
        que[rear++]=st;
        while(head<rear){
            u = que[head++];
            for(i=p[u];i!=-1;i=e[i].next){
                v = e[i].v;
                c = e[i].c;
                if(c && level[v] == 0){
                    level[v] = level[u]+1;
                    que[rear++]=v;
                }
            }
        }
        if(level[ed] == 0){//无增广路
            break;
        }
        memcpy(p1,p,sizeof(p1));
        top = -1;
        while(1){
            if(top<0){
                for(i=p1[st];i!=-1;i=e[i].next){
                    v = e[i].v;
                    c = e[i].c;
                    if(c && p1[v] != -1 && level[v] == 2)break;
                }
                if(i>=0){
                    sta[++top] = i;
                    p1[st] = e[i].next;
                } else break;
            }
            u = e[sta[top]].v;
            if(u == ed){//找到一条增广路
//计算流的可改进量,并记录离源点最远的可能会组成下一条增广路径的边
                int dd = MAX,index = -1;
                for(i=0;i<=top;i++){
                    if(dd>e[sta[i]].c){
                        dd = e[sta[i]].c;
                        index = i;
                    }
                }
                ans += dd;
                //调整残余网络
                for(i=0;i<=top;i++){
                    //直接由上一残余网络计算当前残余网络 见导论P401
                    e[sta[i]].c -= dd;
                    e[sta[i]^1].c += dd;
                }
                //回溯到路径上某个可能继续增广的顶点,若该顶点也无法增广,则回溯到前一个顶点(1)
                for(i=0;i<=top;i++){
                    if(e[sta[i]].c==0){
                        top = index-1;
                        break;
                    }
                }
            } else {
                for(i=p1[u];i!=-1;i = e[i].next){
                    v = e[i].v;
                    c = e[i].c;
                    if(c && p1[v]!=-1 && level[u]+1 == level[v])break;
                }
                if(i!=-1){
                    sta[++top] = i;
                    p1[u] = e[i].next;//若沿着边i找到了增广路,则p1会被从新初始化;否则断定从边i出发无法到达汇点,以后搜索增广路将不再考虑此边。估可将其忽略
                } else {
                    p1[u] = -1;
                    top--;
                }
            }
        }
    }
    return ans;
}


SAP非递归  复杂度O(V*V*E)

#define N 440  
#define M N*N  
#define inf 1<<30
int head[N];  
struct Edge  {  
    int v,next,c;  
}edge[M];  
int ecnt;  

void init(){  
    ecnt = 0;  
    memset(head,-1,sizeof(head));  
}  
void add(int u,int v,int w) {  
    edge[ecnt].v=v;  
    edge[ecnt].c=w;  
    edge[ecnt].next=head[u];  
    head[u]=ecnt++;  
    edge[ecnt].v=u;  
    edge[ecnt].c=0;  
    edge[ecnt].next=head[v];  
    head[v]=ecnt++;  
}  
int sap(int s,int t,int nodenum){ //源,汇,汇点编号(非点数)  
    int pre[N],cur[N],dis[N],gap[N];  
    int flow=0,aug=inf;  
    int u;  
    bool flag;  
    int i,j;  
    for(i=0;i<=nodenum;i++){  
            cur[i]=head[i];  
            gap[i]=dis[i]=0;  
    }  
    gap[s]=nodenum;  
    u=pre[s]=s;  
    while(dis[s]<nodenum){  
        flag=0;  
        for(j=cur[u];j!=-1;j=edge[j].next){  
                int v=edge[j].v;  
                if(edge[j].c>0 && dis[u]==dis[v]+1){  
                    flag=1;  
                    cur[u] = j;  
                    aug = min(aug,edge[j].c);  
                    pre[v]=u;  
                    u=v;  
                    if(u==t){  
                        flow+=aug;  
                        while(u!=s){    
                            u=pre[u];  
                            edge[cur[u]].c -= aug;    //边的正流不断减少 
                            edge[cur[u]^1].c += aug;  //反流增加
                        }  
                        aug=inf;  
                    }  
                    break;  
                }  
        }  
        if(flag)continue;  
        if(--gap[dis[u]] == 0)break;  
        for(dis[u] = nodenum, j=head[u]; j!=-1; j=edge[j].next){  
            int v=edge[j].v;  
            if(edge[j].c>0 && dis[v]<dis[u]){  
                dis[u]=dis[v];  
                cur[u]=j;  
            }  
        }  
        dis[u]++;  
        gap[dis[u]]++;  
        u=pre[u];  
    }  
    return flow;  
}  

ISAP + GAP优化 复杂度O(V^2*E)

#define N 20010 
#define M 500010
int n,m;//n为点数 m为边数  
int h[N];  
int gap[N];  
int p[N],ecnt;  
int source,sink;  
struct edge{  
    int v;  
    int next;//下一条边的编号  
    int val;//边权值  
}e[M];  
  
inline void init(){memset(p,-1,sizeof(p));ecnt=0;}  
   
//有向  
inline void add1(int from,int to,int val){  
    e[ecnt].v=to;  
    e[ecnt].val=val;  
    e[ecnt].next=p[from];  
    p[from]=ecnt++;  
   
    swap(from,to);  
   
    e[ecnt].v=to;  
    e[ecnt].val=0;  
    e[ecnt].next=p[from];  
    p[from]=ecnt++;  
}  
   
//无向  
inline void add2(int from,int to,int val){  
    e[ecnt].v=to;  
    e[ecnt].val=val;  
    e[ecnt].next=p[from];  
    p[from]=ecnt++;  
  
    swap(from,to);  
   
    e[ecnt].v=to;  
    e[ecnt].val=val;  
    e[ecnt].next=p[from];  
    p[from]=ecnt++;  
}  
   
  
inline int dfs(int pos,int cost){  
    if (pos==sink){  
        return cost;  
    }  
    int j,minh=n-1,lv=cost,d;  
    for (j=p[pos];j!=-1;j=e[j].next){  
        int v=e[j].v,val=e[j].val;  
        if(val>0){  
            if (h[v]+1==h[pos]){  
                if (lv<e[j].val) d=lv;  
                else d=e[j].val;  
   
                d=dfs(v,d);  
                e[j].val-=d;  
                e[j^1].val+=d;  
                lv-=d;  
                if (h[source]>=n) return cost-lv;  
                if (lv==0) break;  
            }  
   
            if (h[v]<minh)   minh=h[v];  
        }  
    }  
    if (lv==cost){  
        --gap[h[pos]];  
        if (gap[h[pos]]==0) h[source]=n;  
        h[pos]=minh+1;  
        ++gap[h[pos]];  
    }  
    return cost-lv;  
}  
   
int sap(int st,int ed){  
    source=st;  
    sink=ed;  
    int ans=0;  
    memset(gap,0,sizeof(gap));  
    memset(h,0,sizeof(h));  
    gap[st]=n;  
    while (h[st]<n){  
        ans+=dfs(st,INT_MAX);  
    }  
    return ans;  
}  




























        
EDKII实战:手把手调试PciHostBridge.c,看UEFI如何分配你的PCIe设备资源(IO/Memory空间) 本文深入解析EDKII中PciHostBridge.c模块的工作原理,详细指导如何调试PCIe设备资源分配(IO/Memory空间)。通过实战案例展示UEFI环境下Root Bridge初始化、地址空间转换及协议安装等核心流程,提供常见问题排查方法与性能优化建议,帮助开发者解决PCIe设备兼容性问题。 阅读详情

相关推荐

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

网络流模板(费用流/可行流/上下界)

终于来写博客了= = 一般的最大流 算法:dinic          博主只会这个 大概就是先bfs分层,在增广的时候只走跨层边 加当前弧优化好像快10倍左右,加的时候小心点,容易错 应该只有我会写成暴力吧 struct edge{int t,f,n;}E[M]; void add(int x,int y,int f){ E[++tot]=(edge){y,f,ft

zawedx的博客 2048

从LLaMA到LLaMA-MoE:轻量级混合专家模型构建与实战指南

混合专家(Mixture-of-Experts, MoE)是一种先进的神经网络架构,其核心原理是通过门控网络动态地为不同输入选择不同的专家子网络进行计算,从而实现模型容量的指数级扩展,同时保持推理时的计算量基本不变。这种稀疏激活的特性赋予了MoE极高的技术价值,使其成为解决大模型训练与推理成本矛盾的关键技术之一,在自然语言处理、多模态学习等场景中展现出巨大潜力。本文聚焦于**LLaMA-MoE**这一具体实践,深入探讨了如何基于成熟的稠密模型(如LLaMA),通过**专家构建**与**持续预训练**两大关键

weixin_28730549的博客 565

网络流模板

最大流 【例题1】 这是一道模板题。 给定n个点,m条边,给定每条边的容量,求从点s到点t的最大流。 输入格式: 第一行四个整数n,m,s,t。 接下来的m行,每行三个整数u,v,c,表示从u到v,流量为c的一条边。 数据保证有1≤n≤100,1≤m≤5000,0≤c≤2​31​​−1。 输出格式: 输出点s到点t的最大流。 输入样例: ...

,,,,,,,,,的博客 702

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

手把手教你学Simulink--双足机器人分数阶PID控制仿真

分数阶PID(Fractional-order PID, FOPID)控制是一种先进的控制策略,它扩展了传统的整数阶PID控制器的概念。FOPID控制器允许积分和微分项的阶次不是严格的整数,而是可以是任意实数,这为系统提供了更多的设计自由度,并可能带来更好的性能。在双足机器人控制中,分数阶PID控制可以用于改善机器人的平衡控制、轨迹跟踪等任务的性能。下面我们将详细介绍如何使用Simulink进行基于分数阶PID控制方法的双足机器人仿真研究。

MHD0815的博客 881

网络流模板汇总

Dinic 测试题目 #include "bits/stdc++.h" #define hhh printf("hhh\n") #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) using namespace std; typedef long long ll; typedef pair<int,int&g...

UniverseofHK的博客 397

CSR-DCF视频目标跟踪源码运行笔记

论文基本信息 论文标题:Discriminative Correlation Filter with Channel and Spatial Reliability 论文作者:Alan Lukezic等 论文出处:CVPR 2017 文章链接:https://arxiv.org/abs/1611.08461 补充材料:https://www.semanticscholar.org/paper/D...

越野者的博客 3400

poj 2396(有上下界的 可行流)

Amber大牛的《图论原理》: 问题模型: 给定一个加权的有向图,满足: (1)容量限制条件: (2)流量平衡条件: (2)中的即除了源汇外,所有点都满足流量平衡条件,则称G为有源汇网络;否则,即不存在源汇,所有点都满足流量平衡条件,则称G为无源汇网络。 将这类问题由易到难一一解决: 问题[1] 求无源汇的网络有上下界的可行流 由于下界是一条弧上的流必需要满

Weiguang_123的专栏 957

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 443

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 140

网络流sap算法模板及分析

网络流sap算法模板及分析 zz http://www.cnblogs.com/littlex/archive/2011/08/13/2137568.html typedef struct node{ int v, w; struct node *nx

Aszxqw 1632

115网页版VR模式终于能用了!电脑直接播放vr视频沉浸感满满 115vr播放 无需vr头盔播放vr视频 在线vr播放器 115网盘360度视频播放方法 115全景视频播放教程

油猴 + 脚本让你网页端直接开启 VR 模式支持 360 视频拖动视角,非常沉浸适合电脑设备直接用无需vr头盔也能轻松畅看vr视频,希望也能帮到你。如果你也被 115 的限制搞烦了,不妨试试这招。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 5714

【图论】网络流一些模板

AcWing.2188 无源汇上下界可行流 #include<bits/stdc++.h> #pragma GCC optimize(2) #define ll long long #define rep(i,a,n) for(int i=a;i<=n;i++) #define per(i,n,a) for(int i=n;i>=a;i--) #define endl '\n' #define eps 0.000000001 #define pb push_back #define

Rainfoo的博客 320

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

网络流模板 网络流题型大荟萃

以HDU4560为例,整理了很多网络流的题目—— #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void fre() { freopen("c://test//inpu

snowy_smile的博客 1263

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Kuangbin网络流模板

Kuangbin网络流模板。 const int maxn=20010; const int maxm=200010; const double INF=1e20; const double eps=1e-8; struct Edge{ int to,next; double cap,flow; }edge[maxm],tmpG[maxm]; int ...

weixin_34195546的博客 113

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

wind的网络流神模板--【秒过。。】【网络流】

在被刘汝佳接连坑了两次之后决定不再用刘汝佳的网络流了    之后又找了一些模板   发现wind 的最给力了 1 const int maxn = 405; 2 const int maxm = maxn * maxn; 3 const int inf = 1000000000; 4 5 class Dinic { 6 public : 7 stru

zhanzhaozhangxiaoyi的专栏 323

网络流模板大全

说“大全”,其实也不见得全。。。 1、最大流,Dinic 模板。[LOJ#101] 这题 Dinic 需要卡常才能过,主要是 BFS 从汇点开始搜更快。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype>...

weixin_30390075的博客 162

模板 - 上下界网络流

整理的算法模板合集: ACM模板 目录无源汇上下界可行流有源汇上下界最大流有源汇上下界最小流 无源汇上下界可行流 /* 首先建立一个源S和一个汇T,一般称为附加源和附加汇。 对于图中的每条弧<u,v>,假设它容量上界为c,下界b,那么把这条边拆为三条只有上界的弧。 一条为<S,v>,容量为b;   一条为<u,T>,容量为b;   一条为<u,v>,容量为c-b。 其中前两条弧一般称为附加弧。 然后对这张图跑最大流,

繁凡さん的博客 544

上下界的网络流模板

上下界网络流问题对于每一条边、都有流量上下限的限制 而普通的网络流就只有上限限制 下面分别给出几种经典上下界网络流问题的模板 参考博文Ⅰ、参考博文Ⅱ 1、无源汇的上下界可行流 实际也就是能否找出一个循环流、使得每个点的流入总流量 == 流出总流量 对于原图的每一条边在网络流中容量应当为 (上界 - 下界) 而后计算每个点流入流量的下界总和记为 in 、流出流量的下界总...

188
上一篇: 【混合图欧拉回路】POJ 1637
下一篇: 【unsolved最小割】POJ 1815
leolin_
博客等级 码龄16年 96粉丝 411原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值