#include <iostream>
#include <cstring>
using namespace std;
const int INF = 100000000;
const int MAXN = 210;
int Graph[MAXN][MAXN];
int dist[MAXN];
int n, m;
int MIN(int a, int b)
{
return a < b ? a : b;
}
bool BFS()//建层次网络
{
int Q[100*MAXN];
int qe, qs;
memset(Q, 0, sizeof(Q));
memset(dist, 0xff, sizeof(dist));
qe = qs = 0;
Q[qe++] = 1;
dist[1] = 0;
while(qs < qe)
{
int u = Q[qs++];
for(int v = 1; v <= n; ++v)
{
if(dist[v] < 0 && Graph[u][v] > 0)
{
dist[v] = dist[u] + 1;
Q[qe++] = v;
}
}
}
if(dist[n] > 0)
return true;
else
return false;
}
int Dinic(int u, int low)
{
if(u == n)
return low;
int a = 0;//改进量
for(int v = 1; v <= n; ++v)
{
if( (dist[v] == dist[u] + 1) && (Graph[u][v] > 0) && (a = Dinic(v, MIN(low, Graph[u][v]))))
{
Graph[u][v] -= a;
Graph[v][u] += a;
return a;
}
}
return 0;
}
int main()
{
int u , v, c;
while(cin>>m>>n)
{
memset(Graph, 0, sizeof(Graph));
for(int i = 1; i <= m; ++i)
{
cin>>u>>v>>c;
Graph[u][v] += c;//有可能有重边
}
int MaxFlow = 0;
while(BFS())
{
int a = 0;
while( (a = Dinic(1, INF)) )
MaxFlow += a;
}
cout<<MaxFlow<<endl;
}
return 0;
}
poj1273 Drainage Ditches
最新推荐文章于 2018-08-15 11:16:52 发布