Edmonds-Karp算法

基础的最大流算法,每次Bfs寻找最短路进行增广,这时候的增广和匈牙利算法的增广不同,找出一条残余路径就可以了。

然后对残余网络进行增广,不要忘记正向增广,相当于负向减少,也要在图中保存记录。

最后求一个割集来得到最大流。

 

最大流模型:

点:对点来说要求是进多少出多少

边:对边要求是不能超过最大容量,所以c的值为所有的残余边中的最小值

 

效率

O(VE2),效率可以满足一般题目要求。

 

模板如下;图保存为邻接阵

[cpp]  view plain copy
  1. typedef int Graph[200][200];  
  2. typedef int Path[200];  
  3. Graph map,flow;  
  4. int n,s,t;  
  5. int EK()  
  6. {  
  7. int i, j, k=0, c, head, tail; Graph R;   
  8. Path prev, visit, Q;   
  9. for (i = 0; i < n; i++)  
  10. {  
  11. for (j = 0; j < n; j++)  
  12. {  
  13. flow[i][j] = 0;  
  14. R[i][j] = map[i][j];  
  15. }  
  16. }  
  17. while (true) {  
  18. head = tail = 0;  
  19. memset(visit, falsesizeof(visit));  
  20. Q[tail++] = s;  
  21. prev[s] = -1;  
  22. visit[s] = 1;  
  23. while (head < tail) {  
  24. k = Q[head++];   
  25. for (i = 0; i < n; i++)  
  26. {  
  27. if (!visit[i] & R[k][i] > 0)  
  28. {  
  29. visit[i] = 1;  
  30. prev[i] = k;  
  31. if (i == t) break;  
  32. if(tail>=0) Q[tail++] = i;  
  33. }  
  34. }  
  35. if(i==t) break;  
  36. }  
  37. if (!visit[t]) break;  
  38. c = 1000000;  
  39. j = t;  
  40. while (j != s) {  
  41. i = prev[j];  
  42. if(c>R[i][j]) c=R[i][j];  
  43. j = i;  
  44. }  
  45. j = t;  
  46. while (j != s) {  
  47. i = prev[j];  
  48. flow[i][j] = flow[i][j] + c;  
  49. flow[j][i] = -flow[i][j];  
  50. R[i][j] = map[i][j] - flow[i][j];  
  51. R[j][i] = map[j][i] - flow[j][i];   
  52. j = i;  
  53. }  
  54. }  
  55. c = 0;  
  56. for (i = 0; i < n; i++) {  
  57. c += flow[s][i];  
  58. }  
  59. return c;  
  60. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值