最大流

来源:互联网 发布:win10自带编程软件 编辑:程序博客网 时间:2024/05/16 19:54

这里写图片描述

#include "iostream"#include "stack"#include "vector"#include "string.h"#define min(x, y) x < y ? x : yusing namespace std;struct Edge{    int to;  //终点    int cap; //容量    int rev; //反向边};const int MAX_V = 100;const int MAX_INT = 10000;vector<Edge> G[MAX_V];  //图的邻接表int visit[MAX_V];  //访问标记void addEdge(int from, int to, int cap){    Edge E;    E.to = to;    E.cap = cap;    E.rev = G[to].size();    G[from].push_back(E);    Edge rE;    rE.to = from;    rE.cap = 0;    rE.rev = G[from].size() - 1;    G[to].push_back(rE);}//寻找增广路int dfs(int v, int t, int f){    if(v == t)        return f;    visit[v] = 1;    for(int i=0; i<G[v].size(); i++)    {        Edge &E = G[v][i];        if(!visit[E.to] && E.cap > 0)        {            int d = dfs(E.to, t, min(f, E.cap));            if(d > 0)            {                E.cap -= d;                G[E.to][E.rev].cap += d;                return d;            }        }    }    return 0;}//寻找从s到t的最大流int max_flow(int s, int t){    int flow = 0;    for(;;)    {        memset(visit, 0, sizeof(visit));        int f = dfs(s, t, MAX_INT);        if(f == 0)            return flow;        flow += f;    }}int main(){    addEdge(0, 1, 10);    addEdge(0, 2, 2);    addEdge(1, 2, 6);    addEdge(1, 3, 6);    addEdge(2, 4, 5);    addEdge(3, 2, 5);    addEdge(3, 4, 8);    cout << "最大流为:" << max_flow(0, 4) << endl;    return 0;}

这里写图片描述

0 0
原创粉丝点击