刚接触网络流,先学习最好理解的,其实思想很简单,一直找增广路径,直至找不到也就求出了最大流。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <climits>
using namespace std;
const int maxn = 300;
int n, m;
int pre[maxn];
int gra[maxn][maxn];
bool vis[maxn];
bool bfs(int s, int t)
{
queue < int > q;
memset(vis, false, sizeof(vis));
memset(pre, -1, sizeof(pre));
q.push(s);
vis[s] = true;
int temp;
while(!q.empty())
{
temp = q.front();
q.pop();
for(int i = 1; i <= n; ++ i)
{
if(gra[temp][i] > 0 && !vis[i])
{
pre[i] = temp;
vis[i] = true;
if(i == t)
return true;
q.push(i);
}
}
}
return false;
}
int ek()
{
int maxflow = 0, delta;
int t = n, s = 1;
while(bfs(1, n))
{
delta = INT_MAX;
for(int i = t; i != s; i = pre[i])
{
delta = min(delta, gra[pre[i]][i]);
}
for(int i = t; i != s; i = pre[i])
{
gra[pre[i]][i] -= delta;
gra[i][pre[i]] += delta;
}
maxflow += delta;
}
return maxflow;
}
int main()
{
while(cin >> m >> n)
{
int u, v, w;
memset(gra, 0, sizeof(gra));
for(int i = 1; i <= m; ++ i)
{
scanf("%d%d%d", &u, &v, &w);
gra[u][v] += w;
}
int ans = ek();
cout << ans << endl;
}
return 0;
}