Pagini recente » Cod sursa (job #1019090) | Cod sursa (job #841665) | Cod sursa (job #755841) | Cod sursa (job #235136) | Cod sursa (job #2692334)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M;
vector <int> v[1005];
int cap[1005][1005], flow[1005][1005], maxflow;
bool viz[1005];
int path[1005];
bool bfs()
{
for(int i = 1; i <= N; i++)
viz[i] = false, path[i] = 0;
queue <int> coada;
coada.push(1);
viz[1] = true;
while(!coada.empty())
{
int node = coada.front();
coada.pop();
for(int i = 0; i < v[node].size(); i++)
if(flow[node][v[node][i]] < cap[node][v[node][i]] &&
viz[v[node][i]] == false)
{
path[v[node][i]] = node;
coada.push(v[node][i]);
viz[v[node][i]] = true;
}
}
return viz[N];
}
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y, z;
fin >> x >> y >> z;
v[x].push_back(y);
v[y].push_back(x);
cap[x][y] = z;
}
while(bfs())
{
for(int i = 0; i < v[N].size(); i++)
{
int vecin = v[N][i];
int toadd = cap[vecin][N] - flow[vecin][N];
for(int it = vecin; it != 1; it = path[it])
toadd = min(toadd, cap[path[it]][it] - flow[path[it]][it]);
maxflow += toadd;
flow[vecin][N] += toadd;
flow[N][vecin] -= toadd;
for(int it = vecin; it != 1; it = path[it])
{
flow[path[it]][it] += toadd;
flow[it][path[it]] -= toadd;
}
}
}
fout << maxflow << '\n';
return 0;
}