Pagini recente » Cod sursa (job #2025567) | Cod sursa (job #2964858) | Cod sursa (job #934770) | Cod sursa (job #1681441) | Cod sursa (job #1916912)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#define MAXN 1001
#define InFile "maxflow.in"
#define OutFile "maxflow.out"
using namespace std;
int N, M, S, D;
vector<int> G[MAXN];
int C[MAXN][MAXN];
bool Used[MAXN];
int Tata[MAXN];
int iMaxFlow;
inline void Add(int X, int Y, int Z)
{
G[X].push_back(Y);
G[Y].push_back(X);
C[X][Y] = Z;
}
void read(void)
{
FILE * f = fopen(InFile, "r");
fscanf(f, "%d %d", &N, &M);
for (int i = 1, X, Y, Z; i <= M; i++)
{
fscanf(f, "%d %d %d", &X, &Y, &Z);
Add(X, Y, Z);
}
S = 1; /* Sursa */
D = N; /* Destinatia */
fclose(f);
}
bool bfs()
{
for (int i = 1; i <= N; i++) Used[i] = Tata[i] = 0;
queue<int> Q;
Q.push(S);
Used[S] = 1;
while (!Q.empty())
{
int Nod = Q.front();
Q.pop();
if (Nod == D) continue;
for (vector<int>::iterator i = G[Nod].begin(); i != G[Nod].end(); i++)
{
if (!Used[*i] && C[Nod][*i] > 0)
{
Tata[*i] = Nod;
Used[*i] = 1;
Q.push(*i);
}
}
}
return Used[D];
}
void MaxFlow(void)
{
while (bfs())
{
for (vector<int>::iterator i = G[D].begin(); i != G[D].end(); i++)
{
if (Used[*i] == 1 && C[*i][D] > 0)
{
int ValMin = C[Tata[D]][D];
for (int x = Tata[D]; x != S; x = Tata[x]) ValMin = min(ValMin, C[Tata[x]][x]);
for (int x = Tata[D]; x != S; x = Tata[x]) C[Tata[x]][x] -= ValMin, C[x][Tata[x]] += ValMin;
iMaxFlow += ValMin;
}
}
}
}
void write(void)
{
FILE * g = fopen(OutFile, "w");
fprintf(g, "%d", iMaxFlow);
fclose(g);
}
int main()
{
read();
MaxFlow();
write();
return 0;
}