ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

网络流——最大流-Dinic算法

2019-07-18 11:03:16  阅读:284  来源: 互联网

标签:tnt Head level int MAX 网络 算法 edegs Dinic


 

 

  1 #include<algorithm>
  2 #include<cstring>
  3 #include<cstdio>
  4 using namespace std;
  5 const int MAX_V= 510;
  6 const int MAX_E= 60000;
  7 const int INF= 0x3f3f3f3f;
  8 struct ENode
  9 {
 10     int to;
 11     int c;  //容量;
 12     int Next;
 13 };
 14 ENode edegs[MAX_E];
 15 int Head[MAX_V], tnt;
 16 void Add_ENode(int a, int b, int c)
 17 {
 18     /**建边*/
 19     edegs[++ tnt].to= b;
 20     edegs[tnt].c= c;
 21     edegs[tnt].Next= Head[a];
 22     Head[a]= tnt;
 23     edegs[++ tnt].to= a;
 24     edegs[tnt].c= 0;
 25     edegs[tnt].Next= Head[b];
 26     Head[b]= tnt;
 27 }
 28 void into()
 29 {
 30     /**初始化*/
 31     memset(Head, -1, sizeof(Head));
 32     tnt= -1;
 33 }
 34 
 35 int level[MAX_V];
 36 bool bfs_level (int s, int t)
 37 {
 38     memset(level, -1, sizeof(level)); //所有点的等级初始化为-1;
 39     level[s]= 1; //源点的等级为1;
 40     int que[MAX_V];  //队列que:按序保存已搜索到的点;
 41     int iq= 0;
 42     que[iq ++]= s; //先将源点s 加入队列;
 43     for (int i= 0; i<= iq; i ++)
 44     {
 45         int u= que[i];  //取出队首元素;
 46         if (u== t)
 47         {
 48             /*找到汇点t,返回*/
 49             return true;
 50         }
 51         for (int k= Head[u]; k!= -1; k= edegs[k].Next)
 52         {
 53             /*遍历,查找到之前未找到的、可抵达的点便加入队列*/
 54             int v= edegs[k].to;
 55             if (-1== level[v]&& edegs[k].c)
 56             {
 57                 level[v]= level[u]+ 1; //深度 +1;
 58                 que[iq ++]= edegs[k].to;
 59             }
 60         }
 61     }
 62     return false;
 63 }
 64 int dfs(int now, int c_max, int t)
 65 {
 66     /**DFS 实现多路增广*/
 67     /*now:起点;c_max:从源点s到节点now的最大流量;t:汇点、dfs结束的终点*/
 68     if (now== t) return c_max; //当now== t时,c_max便是要求的最大流;
 69     int ret= 0, f;
 70     for (int k= Head[now]; k!= -1; k= edegs[k].Next)
 71     {
 72         if (edegs[k].c&& level[edegs[k] .to]== level[now]+ 1)
 73         {
 74             /**/
 75             f= dfs(edegs[k].to, min(c_max- ret, edegs[k].c), t);
 76             edegs[k].c-= f;
 77             edegs[k^1].c+= f;
 78             ret+= f;
 79             if(ret== c_max) return ret;
 80         }
 81     }
 82     return ret;
 83 }
 84 int dinic(int s, int t)
 85 {
 86     int ans= 0;
 87     while(bfs_level(s, t))
 88     {
 89         ans+= dfs(s, INF, t);
 90     }
 91     return ans;
 92 }
 93 
 94 int main()
 95 {
 96     /*建图(记得into()初始化)*/
 97     int answer= dinic(s, t);
 98     /*输出结果*/
 99     return 0;
100 }
View Code

 

标签:tnt,Head,level,int,MAX,网络,算法,edegs,Dinic
来源: https://www.cnblogs.com/Amaris-diana/p/11205794.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有