Pagini recente » Cod sursa (job #860718) | Cod sursa (job #2120790) | Cod sursa (job #1522583) | Cod sursa (job #560664) | Cod sursa (job #2954829)
#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<vector<int>> l(NMAX, vector<int>());
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 < l[nod].sz; j++)
{
V = l[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;
l[a].push_back(b);
l[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();
while (BF()) {
int fmin = INF;
int nod;
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;
}
maxFlow += fmin;
}
fout << maxFlow;
return 0;
}