Pagini recente » Cod sursa (job #915195) | Borderou de evaluare (job #2077405) | Cod sursa (job #2659923) | Borderou de evaluare (job #78412) | Cod sursa (job #2306603)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 1000
#define infinit (1 << 30)
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m;
int residualCapacity[nmax][nmax];
bool bfs(int capacity[nmax][nmax],int parent[],int source,int sink)
{
bool vizitat[nmax];
for (int i = 1; i <= n; i++)
vizitat[i] = false;
queue < int > coada;
coada.push(source);
vizitat[source] = true;
bool GasitDrum = false;
while (!coada.empty())
{
int u = coada.front();
coada.pop();
for (int v = 1; v <= n; v++)
{
if (!vizitat[v] && capacity[u][v] > 0)
{
parent[v] = u;
vizitat[v] = true;
coada.push(v);
if (v == sink)
GasitDrum = true;
}
}
}
return GasitDrum;
}
int MaximumFlow(int capacity[nmax][nmax],int source,int sink)
{
int parent[nmax];
int maxflow = 0;
while (bfs(capacity,parent,source,sink) == true)
{
int flow = infinit;
int v = sink;
while (v != source)
{
int u = parent[v];
if (capacity[u][v] < flow)
flow = capacity[u][v];
v = u;
}
maxflow += flow;
v = sink;
while (v != source)
{
int u = parent[v];
capacity[u][v] -= flow;
capacity[v][u] += flow;
v = u;
}
}
return maxflow;
}
int main()
{
fin >> n >> m;
for (int i = 1 ;i <= m; i++)
{
int x, y, c;
fin >> x >> y >> c;
residualCapacity[x][y] = c;
}
fout << MaximumFlow(residualCapacity,1,n);
return 0;
}