Pagini recente » Cod sursa (job #1990770) | Cod sursa (job #2889178) | Cod sursa (job #2528430) | Cod sursa (job #1648421) | Cod sursa (job #2889080)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const string filename = "maxflow";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int maxN = 1005, inf = 2e9;
int n, m, p[maxN], cap[maxN][maxN], flux[maxN][maxN], max_flux;
bool used[maxN];
vector <int> G[maxN];
queue <int> q;
bool bfs()
{
for(int i = 1; i <= n; i++)
used[i] = 0;
while(!q.empty())
q.pop();
q.push(1);
used[1] = 1;
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n)
return 1;
for(int vecin : G[nod])
{
if(used[vecin])
continue;
if(cap[nod][vecin] > flux[nod][vecin])
{
p[vecin] = nod;
used[vecin] = 1;
q.push(vecin);
}
}
}
return 0;
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y, c;
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = c;
}
while(bfs())
{
//cout << max_flux << ' ';
for(int vecin : G[n])
{
if(cap[vecin][n] == flux[vecin][n])
continue;
if(!used[vecin])
continue;
p[n] = vecin;
int min_flow = inf;
for(int x = n; x != 1; x = p[x])
min_flow = min(min_flow, cap[p[x]][x] - flux[p[x]][x]);
if(min_flow == 0)
continue;
for(int x = n; x != 1; x = p[x])
{
flux[p[x]][x] += min_flow;
flux[x][p[x]] -= min_flow;
}
max_flux += min_flow;
}
}
fout << max_flux;
return 0;
}