Pagini recente » Cod sursa (job #2420420) | Cod sursa (job #1164604) | Cod sursa (job #2564808) | Cod sursa (job #2663175) | Cod sursa (job #1117196)
// Eu - O(N*M*M)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
#define Mx 1024
#define Inf 333333333
int cap[Mx][Mx], fl[Mx][Mx];
int viz[Mx], tat[Mx];
vector <int> Ad[Mx];
int N, M;
int BF()
{
int i, j, v1, v2, q[Mx],lq;
lq = 1; q[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (i = 1; i <= lq; i++)
{
v1 = q[i];
if (v1 != N)
{
for (j = 0; j < Ad[v1].size(); j++)
{
v2 = Ad[v1][j];
if (cap[v1][v2] > fl[v1][v2] && !viz[v2])
{
viz[v2] = 1;
q[ ++lq ] = v2;
tat[v2] = v1;
}
}
}
}
return viz[N];
}
int main()
{
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
int i, f=0, fmin, x, y, z, v;
fi >> N >> M;
for (i = 1; i <= M; i++)
{
fi >> x >> y >> z;
cap[x][y] += z;
Ad[x].push_back(y);
Ad[y].push_back(x);
}
while (BF())
for (i = 0; i < Ad[N].size(); i++)
{
v = Ad[N][i];
if (fl[v][N] == cap[v][N] || !viz[v]) continue;
tat[N] = v;
fmin = Inf;
for (v = N; v != 1; v = tat[v])
fmin = min(fmin, cap[ tat[v] ][v] - fl[ tat[v] ][v]);
// if (fmin != 0) {
for (v = N; v != 1; v = tat[v])
{
fl[ tat[v] ][v] += fmin;
fl[v][ tat[v] ] -= fmin;
}
f += fmin;
// }
}
fo << f << "\n";
return 0;
}