Pagini recente » Cod sursa (job #2232853) | Cod sursa (job #2423535) | Cod sursa (job #1357644) | Cod sursa (job #1188050) | Cod sursa (job #1262827)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define MaxVertex 1005
int V,E;
int Capacity[MaxVertex][MaxVertex];
int Flow[MaxVertex][MaxVertex];
vector < vector < int > > AdcMatrix;
bool Visited[MaxVertex];
int Father[MaxVertex];
bool BFS()
{
memset(Visited, false, sizeof(Visited));
memset(Father, 0, sizeof(Father));
static queue < int > Q;
Q.push(1);
Visited[1] = true;
static int Vertex;
static vector < int > :: iterator it;
while(!Q.empty())
{
Vertex = Q.front();
Q.pop();
for(it = AdcMatrix[Vertex].begin() ; it != AdcMatrix[Vertex].end() ; ++it)
{
if(!Visited[*it] && Capacity[Vertex][*it] > Flow[Vertex][*it])
{
Father[*it] = Vertex;
Visited[*it] = true;
if(*it != V)
Q.push(*it);
}
}
}
return Visited[V];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &V, &E);
int i;
for(i = 0 ; i <= V ; ++i)
AdcMatrix.push_back( vector < int > () );
int VA,VB;
for(i = 1 ; i <= E ; ++i)
{
scanf("%d%d", &VA, &VB);
scanf("%d", &Capacity[VA][VB]);
AdcMatrix[VA].push_back(VB);
AdcMatrix[VB].push_back(VA);
}
int MinFlow;
int MaxFlow = 0;
vector < int > :: iterator it;
while(BFS())
{
for(it = AdcMatrix[V].begin() ; it != AdcMatrix[V].end() ; ++it)
{
if(!Visited[*it])
continue;
Father[V] = *it;
MinFlow = (1 << 31) - 1;
i = V;
while(i != 1)
{
MinFlow = min(MinFlow, Capacity[Father[i]][i] - Flow[Father[i]][i]);
i = Father[i];
}
i = V;
while(i != 1)
{
Flow[Father[i]][i] += MinFlow;
Flow[i][Father[i]] -= MinFlow;
i = Father[i];
}
MaxFlow += MinFlow;
}
}
printf("%d", MaxFlow);
return 0;
}