自己yy的fulkson最大流算法

#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;
const int maxn=1e3+7;
//maxn means the max
const int INF=~0u>>1;
struct node{
    int to,cap,rev;
    node(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){}
};
vector<node> edge[maxn];
bool vis[maxn];
void add(int from,int to,int cap){
    edge[from].push_back(node(to,cap,edge[to].size()));
    edge[to].push_back(node(from,0,edge[from].size()-1));
}

//dfs 小心爆int
int dfs(int v,int t,int f){
    if(v==t) return f;
    int i;
    for(i=0;i<edge[v].size();++i){
        int p=edge[v][i].to;
        if(!vis[p]&&edge[v][i].cap>0){
            vis[p]=true;
            int flow=edge[v][i].cap;
            int d=dfs(p,t,min(flow,f));
            if(d>0){
                edge[v][i].cap-=d;
                edge[p][edge[v][i].rev].cap+=d;
                return d;
            }
            //vis[p]=false;//这里丢了
            //如果加上了对流量大于零的判断我们
            //完全可以不写这一句
        }
    }
    return 0;
}
int maxflow(int s,int t){
    int flow=0;
    for(;;){
        memset(vis,0,sizeof(vis));//这里丢了
        vis[s]=true;//这里丢了
        int f=dfs(s,t,INF);
        if(f==0) break;
        flow+=f;
    }
    return flow;
}
int n,s,t;
void print(){
    int i,j;
    //这样写必须保证s<=t
    for(i=s;i<=t;++i){
        printf("head:%d",i);
        for(j=0;j<edge[i].size();++j){
            node t=edge[i][j];
            printf("==>(%d,%d,%d)",t.to,t.cap,t.rev);
        }
        printf("\n");
    }
}
int main(){
    // printf("INF:%d\n",INF);
    scanf("%d",&n);
    //输入的有向边数量
    scanf("%d%d",&s,&t);
    int i,u,v,cap;
    for(i=0;i<n;++i){
        scanf("%d%d%d",&u,&v,&cap);
        add(u,v,cap);
    }
    print();
    int mx=maxflow(s,t);
    printf("==============\n");
    print();
    printf("maxflow:%d\n",mx);
    return 0;
}
时间: 2024-10-13 08:25:28

自己yy的fulkson最大流算法的相关文章

C++ 基于Dijkstra最短路搜索的Ford Fulkson最大流算法

#include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> #include<cstring> using namespace std; const int MAXN = 120; const int INF = INT_MAX; int G[MAXN][MAXN], N; int dist[MAXN], Pre[MAXN]; bool visited[MAXN];

最大流算法(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=

Cable TV Network 顶点连通度 (最大流算法)

Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.           对于原图中的边(u,v)   连边   u''--->v'    v''-->u'.    求每对定点的P(u,v);以u为源点,v为汇点. 我们只需固定一个顶点,枚举其它汇点. 1 #include <iostream> 2 #include <cstdio> 3

算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法.那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢? 这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析. 为了分析问题,需要假定图中所有边的容量都是整数.但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束. 首先将所有边的容量都初始化为0. 第一次迭代和第二次迭代之后,两条边各增加了1. 到最后200次迭代之后整个算法才结束. 这还不算最坏的情况.因为整数最多

算法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. 下图展示了一个流网络

G - YY&#39;s new problem(HUSH算法,目前还不懂什么是HUSH算法)

Time Limit:4000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3833 Description Given a permutation P of 1 to N, YY wants to know whether there exists such three elements P[i1], P[i2], P[i3] that P[i1]-P[i2]=P

接口限流算法总结

背景 曾经在一个大神的博客里看到这样一句话:在开发高并发系统时,有三把利器用来保护系统:缓存.降级和限流.那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了.通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的.本篇文章将会介绍一下常用的限流算法以及他们各自的特点. 算法介绍 计数器法 计 数器法是限流算法里最简单也是最容易实现的一种算法.比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个.那么我们可以这么做:在一开 始的时候,我们可

常用的限流算法

常用的限流算法大致有三种:令牌桶算法,漏桶算法,计数器算法 令牌桶算法 令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.令牌桶算法的描述如下: 1.假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌 2.桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝 3.当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上 4.如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待) 漏桶算法 漏桶作为计量工具(The