Pagini recente » Cod sursa (job #2154956) | Cod sursa (job #2828546) | Cod sursa (job #2252453) | Cod sursa (job #2682646) | Cod sursa (job #2174766)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int> G[1005];
bool Use[1005];
int C[1005][1005], F[1005][1005], N, M, TT[1005];
queue <int> Q;
void Read()
{
f >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y, c;
f >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] += c;
}
}
bool BFS()
{
for(int i = 1; i <= N; i++)
TT[i] = -1, Use[i] = 0;
Q.push(1);
Use[1] = 1;
while(!Q.empty())
{
int node = Q.front();
Q.pop();
if(node == N)
continue;
for(int i = 0; i < G[node].size(); i++)
{
int neighb = G[node][i];
if(Use[neighb] == 1 || C[node][neighb] - F[node][neighb] == 0)
continue;
Use[neighb] = 1;
TT[neighb] = node;
Q.push(neighb);
}
}
return Use[N];
}
void maxF()
{
int MaxFlow = 0;
while(BFS())
{
for(int i = 0; i < G[N].size(); i++)
{
int neighb = G[N][i];
if(Use[neighb] == 0 || C[neighb][N] - F[neighb][N] == 0)
continue;
TT[N] = neighb;
int fmin = 1000000000;
for(int i = N; i != 1; i = TT[i])
fmin = min(fmin, C[TT[i]][i] - F[TT[i]][i]);
MaxFlow += fmin;
for(int i = N; i != 1; i = TT[i])
{
F[TT[i]][i] += fmin;
F[i][TT[i]] -= fmin;
}
}
}
g << MaxFlow << "\n";
}
int main()
{
Read();
maxF();
return 0;
}