【网络流各种模板】

网络流模板-------最大流模板 网络流模板 一.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;  
}  




























        
从AP到ADSP:高通8650 AudioReach中GSL-Passthru-GPR的数据通路剖析 本文深入剖析了高通骁龙8650平台AudioReach架构中,音频数据从应用处理器(AP)到音频数字信号处理器(ADSP)的完整传输路径。重点解析了GSL(Graph Service Layer)如何封装命令,并通过Passthru驱动与GPR(Generic Packet Router)协同工作,实现跨处理器的高效、异步数据交换,揭示了现代手机复杂音频系统背后的核心通信机制。 阅读详情

相关推荐

解决UE5像素流三大痛点:鼠标锁定/双光标/自动播放(附app.js魔改指南)

本文针对UE5像素流服务在实际应用中常见的鼠标锁定、双光标和自动播放三大交互痛点,提供了深入的技术分析和解决方案。通过详细解析app.js源码,指导开发者如何修改控制方案、修复光标显示以及实现静音自动播放,旨在提升Pixel Streaming应用的用户体验与专业度。

weixin_28025327的博客 383

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

终于来写博客了= = 一般的最大流 算法: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

在LangChain中使用DashVector进行高效向量检索

DashVector为需要处理高维向量数据的开发者提供了一种便捷且高效的解决方案。通过将其集成到LangChain生态系统中,您可以轻松实现复杂的语义搜索和数据分析功能。DashVector官方文档LangChain GitHub仓库有关DashVector的详细notebook示例。

sjufgwgfhoia的博客 455

网络流模板

最大流 【例题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

LIO-SAM运行报错‘process has died’?别慌,一个命令搞定libmetis.so库路径问题

本文详细解析了LIO-SAM运行中常见的‘process has died’报错问题,特别是由libmetis.so库路径错误导致的节点崩溃。通过一个简单的命令移动库文件到正确位置,即可快速解决这一问题,同时提供了多种替代方案和预防措施,帮助开发者更好地理解Linux动态库加载机制和ROS环境管理。

weixin_29231221的博客 205

二、声明式 Pipeline 语法

选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值,例如:parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) },表示定义一个名为 CHOICES 的变量,可选的值为 one、two、three;默认情况下,如果定义了某个 stage 的 agent,在进入该 stage 的 agent 后,该 stage 的 when条件才会被评估,但是可以通过一些选项更改此选项。

Cyan_Jiang的博客 1220

网络流模板汇总

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

LMI线性矩阵不等式之非线性变量处理

​ 如果一个LMI线性矩阵不等式中的某项存在两个矩阵变量相乘,那么称该类情形为非线性矩阵不等式,而要直接求解时很困难的,而且LMI工具箱也无法求解非线性矩阵,所以需要通过变量替换法进行处理。 ​...

Mr.邹的博客 4550

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

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

Weiguang_123的专栏 957

Cadence Virtuoso实战:用gm/Id方法搞定折叠式共源共栅放大器设计(附完整仿真流程)

本文详细介绍了在Cadence Virtuoso设计环境中,运用gm/Id方法高效设计折叠式共源共栅放大器的完整实战流程。该方法通过工艺特征曲线,将设计指标映射到晶体管尺寸与偏置,有效克服深亚微米工艺下传统方法的不足。文章以TSMC 180nm工艺为例,从指标拆解、参数查找、电路搭建、仿真验证到问题调试,提供了清晰、可复现的操作指南,并探讨了自动化脚本与版图考量,助力工程师和学生提升模拟IC设计效率与成功率。

jwt8token的博客 647

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6123

网络流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

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1432

【图论】网络流一些模板

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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、付费专栏及课程。

余额充值