[图论]最大流问题(网络流最大流EK算法 BFS)

来源:互联网 发布:windows insider iso 编辑:程序博客网 时间:2024/04/29 21:13
/*Name:最大流问题 (网络流最大流EK增广路 BFS)Actor:HTTime:2015年8月15日Error Reporte:*/#include <iostream>#include <stdio.h>#include <conio.h>#include <string.h>#include <vector>#include <algorithm>#define N 50#define INF 0x3f3f3f3fusing namespace std;//最大流——EK增广路算法://每次只找一条增广路,//而后更新残图,//在残图中寻找可行增广路,//所有的增广路汇到一起就是结果流。//每条增广路走的流量为改路中最窄流量。int flow[N][N];//残余网络的流量int cap[N][N];//网络流量限制int pa[N];//记录每次来源父节点int pas[N];//记录每次到所有点处最小残量int ans;//总流量int front, rear;int que[N];int s, t;int main(){int i, j;int n;int a, b, l;int temp;while (scanf("%d %d", &t, &n) != EOF){memset(flow, 0, sizeof(flow));memset(cap, 0, sizeof(cap));for (i = 0; i < n; i++){scanf("%d %d %d", &a, &b, &l); cap[a][b] = cap[b][a] = l;}s = 1;ans = 0;for (;;)//开始刷图{memset(pas, 0, sizeof(pas));pas[s] = INF;front = 0;rear = 1;que[front] = s;while (front != rear)//BFS找增广路{for (i = 1; i <= t; i++){temp = cap[que[front]][i] - flow[que[front]][i];if (pas[i] != 0 || temp <= 0)//本次没有流过 并且 有剩余流量,才可以考虑continue;pas[i] = (pas[que[front]] < temp ? pas[que[front]] : temp);//补正最小值pa[i] = que[front];//记录父节点que[rear] = i;rear++;//cout << que[front]<<"----"<<i<<"    "<< pas[i] << endl;}front++;}if (pas[t] == 0) break;//找不到有效增广路了,结束for (i = t; i != s; i = pa[i])//更新残图,精彩的找爹循环{flow[pa[i]][i] += pas[t];flow[i][pa[i]] -= pas[t];}ans += pas[t];//总流量记录}printf("%d\n", ans);}return 0;}

0 0