Pagini recente » Cod sursa (job #2483189) | Cod sursa (job #384673) | Cod sursa (job #3154574) | Cod sursa (job #1409461) | Cod sursa (job #2849680)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int NMAX = 1001,
INF = 0x3f3f3f3f;
int N, M, S, D,
C[NMAX][NMAX],
F[NMAX][NMAX],
T[NMAX];
vector<int> G[NMAX];
ifstream f("maxflow.in");
ofstream g("maxflow.out");
void citire()
{
int x, y;
f >> N >> M;
while(M--)
{
f >> x >> y >> C[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
}
bool bfs()
{
queue <int> Q;
for(int i = 1; i <= N; ++i)
T[i] = 0;
T[S] = -1;
Q.push(S);
while(!Q.empty())
{
int nod = Q.front();
Q.pop();
for(int &i : G[nod])
if(T[i] == 0 && C[nod][i] > F[nod][i])
{
T[i] = nod;
Q.push(i);
}
}
return T[D] != 0;
}
int Edmonds_Karp()
{
int flow = 0;
int i, cmin;
while(bfs())
{
cmin = INF;
for(i = D; i != S; i = T[i])
cmin = min(cmin, C[T[i]][i] - F[T[i]][i]);
for(i = D; i != S; i = T[i])
{
F[T[i]][i] += cmin;
F[i][T[i]] -= cmin;
}
flow+=cmin;
}
return flow;
}
int main()
{
citire();
S = 1;
D = N;
g << Edmonds_Karp();
return 0;
}