基于BFS的最大流算法(Edmonds)

#include<iostream>

using namespace std;

#define MAXN 10003

bool Vis[100];

int Map[100][100],F[100][100],n,Target,Min;

struct queen

{

int top;

int end;

int node[100];

}f;

struct vertex

{

int back;

bool dir;// if we enter x the dir would be 1, since leaving x,the dir would be 0.

} Hase[100];

bool BFS(int x)

{

f.top=0;

f.end=1;

Vis[x]=1;

f.node[f.top]=x;

while(f.top!=f.end)

{

int z=f.node[f.top];

if(z==Target)

return true;

f.top=(f.top++)%50;

for(int i=0;i<n;i++)

{

if(F[z][i]<Map[z][i]&&Vis[i]==0)

{

f.node[f.end]=i;

f.end=(f.end++)%50;

Vis[i]=1;

Hase[i].back=z;

Hase[i].dir=1;

}

if(F[i][z]>0&&Vis[i]==0)

{

f.node[f.end]=i;

f.end=(f.end++)%50;

Vis[i]=1;

Hase[i].back=z;

Hase[i].dir=0;

}

}

}

return false;

}

void Solve()

{

int start;

cin>>n;

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

cin>>Map[i][j];

while(cin>>start>>Target)

{

memset(Vis,0,sizeof(Vis));

memset(Hase,-1,sizeof(Hase));

memset(F,0,sizeof(F));

while(BFS(start))

{

memset(Vis,0,sizeof(Vis));

Min=MAXN;

for(int i=Target;i!=start;i=Hase[i].back)

{

if(Hase[i].dir==1)

Min=min(Map[Hase[i].back][i] - F[Hase[i].back][i] , Min);

else

Min=min(F[i][Hase[i].back] , Min);

}

for(int i=Target;i!=start;i=Hase[i].back)

{

if(Hase[i].dir==1)

F[Hase[i].back][i]+=Min;

else

F[i][Hase[i].back]-=Min;

}

}

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<F[i][j]<<" ";

cout<<endl;

}

}

}

int main()

{

Solve();

return 0;

}

时间: 2024-08-27 03:59:59

基于BFS的最大流算法(Edmonds)的相关文章

最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y:x) int pre[105],q[105]; int F[105][105]; int n,nc,np,m,s,t,all; int MaxFlow(int s, int t){ int ans=0; while(1){ memset(pre,0,sizeof(pre)); int head=0,tail=

算法9-5:最大流算法的Java代码

残留网络 在介绍最大流算法之前先介绍一下什么是残留网络.残余网络的概念有点类似于集合中的补集概念. 下图是残余网络的例子.上面的网络是原始网络,下面的网络是计算出的残留网络.残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量. 流量网络 最大流算法比以前介绍的算法都要复杂.网络中的每一条边需要记录容量和当前流量.容量是固定值,是已知条件,而当前流量在计算过程中会一直发生变化.因此,需要建立一个专门的类,用于最大流算法. public class FlowEdge { private i

Ford-Fulkerson 最大流算法

流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, v) = 0.流网络中有两个特殊的顶点:源点 s (source)和汇点 t(sink).为方便起见,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点 v ∈ E,存在一条路径 s --> v --> t.因此,图 G 为连通图,且 |E| ≥ |V| - 1. 下图展示了一个流网络

基于大数据技术推荐系统算法案例实战视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

最大流算法和理论的简单理解

我退坑很久了,这篇文章不是因为刷OJ而写的总结,毕竟菜鸡老年人, 23333 之前我学网络流看的是算法书和别人的博客然后就开始套板子,而这次因为考试不得已把课本上的定理都看了一遍,瞬间对最大流算法更加清楚了. 1.定义 在学习网络流算法前要了解的一些知识. 1.对于一个有向的网络$G=(N, A, C)$,其中的$c_{i,j}$表示弧$(i,j)\in A$的容量,并设$s,t$为发点和收点,令$$x_{i,j}=通过弧(i,j)的流量$$2.对于一个满足流量限制的流量称之为可行流,其中限制条

限流算法之漏桶算法、令牌桶算法

昨天CodeReview的时候看到同时使用RateLimiter这个类用作QPS访问限制.学习一下这个类. RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类. 1.限流 每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪. 通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务,或者引流. 如果要准确的控制Q

统一流控服务开源:基于.Net Core的流控服务

原文:统一流控服务开源:基于.Net Core的流控服务 先前有一篇博文,梳理了流控服务的场景.业界做法和常用算法 统一流控服务开源-1:场景&业界做法&算法篇 最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠.今天整理一下核心设计和实现思路,开源到Github上,分享给大家 https://github.com/zhouguoqing/FlowControl  一.令牌桶算法实现 先回顾一下令牌桶算法示意图 随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=10

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

Mahout实现基于用户的协同过滤算法

Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中. package com.mahout.helloworlddemo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.