Pagini recente » Cod sursa (job #1257975) | Cod sursa (job #2625098) | Cod sursa (job #2918059) | Cod sursa (job #2330644) | Cod sursa (job #1274613)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream ka("maxflow.in");
ofstream ki("maxflow.out");
const int N_MAX = 1000;
vector <int> graf[N_MAX + 1];
int c[N_MAX + 1][N_MAX + 1];
int f[N_MAX + 1][N_MAX + 1];
int previous[N_MAX + 1];
int coada[N_MAX + 1];
bool vizitat[N_MAX + 1];
int n, m, x, y, z;
int flux = 0;
bool bfs()
{
coada[0] = 1;
coada[1] = 1;
for(int i = 1; i <= n; i++)
vizitat[i] = false;
vizitat[1] = true;
for(int i = 1; i <= coada[0]; i++)
{
int nod = coada[i];
if(nod == n)
continue;
for(int j = 0; j < graf[nod].size(); j++)
{
int v = graf[nod][j];
if(c[nod][v] == f[nod][v] || vizitat[v])
continue;
vizitat[v] = true;
coada[++coada[0]] = v;
previous[v] = nod;
}
}
return vizitat[n];
}
int main()
{
ka >> n >> m;
for(int i = 1; i <= m; i++)
{
ka >> x >> y >> z;
c[x][y] = z;
graf[x].push_back(y);
graf[y].push_back(x);
}
while(bfs())
{
for(int i = 0; i < graf[n].size(); i++)
{
int nod = graf[n][i];
if(c[nod][n] == f[nod][n] || !vizitat[nod])
continue;
previous[n] = nod;
int flux_min = 0x7fffffff;
for(nod = n; nod != 1; nod = previous[nod])
flux_min = min(flux_min, c[previous[nod]][nod] - f[previous[nod]][nod]);
if(flux_min == 0)
continue;
for(nod = n; nod != 1; nod = previous[nod])
{
f[previous[nod]][nod] += flux_min;
f[nod][previous[nod]] -= flux_min;
}
flux += flux_min;
}
}
ki << flux;
}