Pagini recente » Cod sursa (job #1422587) | Cod sursa (job #1277157) | Cod sursa (job #1998659) | Cod sursa (job #834992) | Cod sursa (job #2954831)
#include <stdio.h>
#include <vector>
#include <cstring>
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define NMAX 1024
#define pb push_back
#define sz size()
#define mp make_pair
#define INF 0x3f3f3f3f
int capacity[NMAX][NMAX];
int flow[NMAX][NMAX];
int parent[NMAX];
vector<int> G[NMAX];
int n, m, maxFlow;
int cd[NMAX];
int viz[NMAX];
int BF()
{
int i, j, nod, V;
cd[0] = 1;
cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (i = 1; i <= cd[0]; i++)
{
nod = cd[i];
for (j = 0; j < G[nod].sz; j++)
{
V = G[nod][j];
if (capacity[nod][V] == flow[nod][V] || viz[V]) continue;
viz[V] = 1;
cd[++cd[0]] = V;
parent[V] = nod;
if (V == n) return 1;
}
}
return 0;
}
void read() {
fin >> n >> m;
while (m--) {
int a, b, c;
fin >> a >> b >> c;
G[a].push_back(b);
G[b].push_back(a);
capacity[a][b] = c; // muchia de inaintare
capacity[b][a] = 0; // muchia de intoarcere (intial nu se poate face undo deoarece nu trece nimic)
}
}
int main(){
read();
int fmin, nod;
for (maxFlow = 0; BF(); maxFlow += fmin)
{
fmin = INF;
for (nod = n; nod != 1; nod = parent[nod])
fmin = min(fmin, capacity[parent[nod]][nod] - flow[parent[nod]][nod]);
for (nod = n; nod != 1; nod = parent[nod])
{
flow[parent[nod]][nod] += fmin;
flow[nod][parent[nod]] -= fmin;
}
}
fout << maxFlow;
return 0;
}