#include <iostream>
#include <queue>
using namespace std;
#define MAXN 200
#define MAXC 10000000
int f[ MAXN ][ MAXN ];
int previous[ MAXN ];
queue<int> q;
int N, M, S, E, C;
void init()
{
for(int i = 0; i < MAXN; i ++)
{
for(int j = 0; j < MAXN; j ++)
{
f[ i ][ j ] = 0;
}
}
}
bool BFS(int src, int dst)
{
int u;
int *v = new int[ M ];
for(int i = 0; i < M; i ++)
{
v[ i ] = 0;
}
while(!q.empty())
{
q.pop();
}
q.push(src);
previous[ src ] = -1;
v[ src ] = 1;
while(!q.empty())
{
u = q.front();
q.pop();
if(u == dst)
{
break;
}
for(int i = 0; i < M; i ++)
{
if(f[ u ][ i ] != 0 && v[ i ] == 0)
{
q.push(i);
previous[ i ] = u;
v[ i ] = 1;
}
}
}
if(u == dst)
{
return true;
}
else
{
return false;
}
}
int EK(int src, int dst)
{
int t, minflow;
int ans = 0;
while(BFS(src, dst))
{
t = dst;
minflow = MAXC;
while(t != src)
{
if(f[ previous[ t ] ][ t ] < minflow)
{
minflow = f[ previous[ t ] ][ t ];
}
t = previous[ t ];
}
ans += minflow;
t = dst;
while(t != src)
{
f[ previous[ t ] ][ t ] -= minflow;
f[ t ][ previous[ t ] ] += minflow;
t = previous[ t ];
}
}
return ans;
}
int main()
{
while(scanf("%d %d", &N, &M) != EOF)
{
init();
while(N > 0)
{
scanf("%d %d %d", &S, &E, &C);
f[ S - 1 ][ E - 1 ] += C;
N --;
}
printf("%d\n", EK(0, M - 1));
}
return 0;
}
杭电ACM1532(最大流)
最新推荐文章于 2018-09-06 21:09:59 发布