Pagini recente » Cod sursa (job #2385090) | Cod sursa (job #1182779)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 1000
#define INF 999999
using namespace std;
int capacitate[MAXN][MAXN], flux[MAXN][MAXN], viz[MAXN], parinte[MAXN], s, d;
vector<int> G[MAXN];
queue<int> Q;
int bfs(int sursa, int dest)
{
int i, nod;
for (i = 0; i < MAXN; i++)
{
viz[i] = 0;
}
Q.push(sursa);
while (!Q.empty())
{
nod = Q.front();
Q.pop();
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); it++)
{
if (!viz[*it] && (flux[nod][*it] != capacitate[nod][*it]))
{
parinte[*it] = nod;
viz[*it] = 1;
if (*it != dest)
{
Q.push(*it);
}
}
}
}
return viz[dest];
}
int edmonds_karp()
{
int maxflow = 0, minim, nod, cf;
while (bfs(s, d) != 0)
{
for (vector<int>::iterator it = G[d].begin(); it != G[d].end(); it++)
{
parinte[d] = *it;
if (viz[*it] && (flux[*it][d] != capacitate[*it][d]))
{
minim = INF;
nod = d;
while (nod != s)
{
cf = capacitate[parinte[nod]][nod] - flux[parinte[nod]][nod];
if (cf < minim)
{
minim = cf;
}
nod = parinte[nod];
}
nod = d;
while (nod != s)
{
flux[nod][parinte[nod]] -= minim;
flux[parinte[nod]][nod] += minim;
nod = parinte[nod];
}
maxflow += minim;
}
}
}
return maxflow;
}
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, i, x, y;
f >> n >> m;
for (i = 0; i < m; i++)
{
f >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
f >> capacitate[x][y];
}
s = 1; d = n;
g << edmonds_karp();
f.close();
g.close();
return 0;
}