网络流最大流问题-1(增广路——EK)

来源:互联网 发布:中六保五缩水软件 编辑:程序博客网 时间:2024/05/01 23:47

增广路*

增广路定义:在残量网络中的一条从s通往t的路径,其中任意一条弧(u,v),都有其残量网络流量r[u,v]>0。

其中绿色的就是增广路。


增广路算法*

增广路算法:每次用BFS找一条最短的增广路径,然后沿着这条路径修改流量值(实际修改的是残量网络的边权)。当没有增广路时,算法停止,此时的流就是最大流。


增广路算法的效率*

设n = |V|,  m = |E|

每次增广都是一次BFS,效率为O(m),而在最坏的情况下需要(n-2增广。(即除源点和汇点外其他点都没有连通,所有点都只和s与t连通)

所以,总共的时间复杂度为O(m*n),所以在稀疏图中效率还是比较高的。


hoj1532 模板代码

<span style="font-size:18px;">    #include <cstdio>      #include <cstring>      #include <iostream>      #include <string>      #include <algorithm>      #include <map>      #include <vector>      using namespace std;      const int N = 1100;      const int INF = 0x3f3f3f3f;            struct Node      {          int to;//终点          int cap; //容量          int rev;  //反向边      };            vector<Node> v[N];      bool used[N];            void add_Node(int from,int to,int cap)  //重边情况不影响      {          v[from].push_back((Node){to,cap,v[to].size()});          v[to].push_back((Node){from,0,v[from].size()-1});      }            int dfs(int s,int t,int f)      {          if(s==t)              return f;          used[s]=true;          for(int i=0;i<v[s].size();i++)          {              Node &tmp = v[s][i];  //注意              if(used[tmp.to]==false && tmp.cap>0)              {                  int d=dfs(tmp.to,t,min(f,tmp.cap));                  if(d>0)                  {                      tmp.cap-=d;                      v[tmp.to][tmp.rev].cap+=d;                      return d;                  }              }          }          return 0;      }            int max_flow(int s,int t)      {          int flow=0;          for(;;){              memset(used,false,sizeof(used));              int f=dfs(s,t,INF);              if(f==0)                  return flow;              flow+=f;          }      }      int main()      {          int n,m;          while(~scanf("%d%d",&n,&m))          {              memset(v,0,sizeof(v));              for(int i=0;i<n;i++)              {                  int x,y,z;                  scanf("%d%d%d",&x,&y,&z);                  add_Node(x,y,z);              }              printf("%d\n",max_flow(1,m));          }      }  </span>



1 0
原创粉丝点击