Pagini recente » Cod sursa (job #2113118) | Cod sursa (job #2112876) | Cod sursa (job #1759892) | Cod sursa (job #657488) | Cod sursa (job #1994931)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
bool viz[1001];
int capacitate[1001][1001];
int flux[1001][1001];
int tata[1001];
int n, m;
vector <int> graf[1001];
deque <int> solutie;
bool maxflow (int sursa)
{
viz[sursa] = 1;
solutie.push_back(sursa);
while (solutie.empty() == 0)
{
int nod = solutie.front();
solutie.pop_front();
if (nod == n)
continue;
for (auto x:graf[nod])
{
if (viz[x] == 0 && flux[nod][x]<capacitate[nod][x])
{
viz[x] = 1;
solutie.push_back(x);
tata[x] = nod;
}
}
}
return viz[n];
}
int main()
{
int raspuns = 0;
fin >> n >> m;
for (int i = 1; i<=m; ++i)
{
int x, y, f;
fin >> x >> y >> f;
capacitate[x][y]+=f;
graf[x].push_back(y);
graf[y].push_back(x);
}
while (maxflow(1))
{
for (auto x:graf[n])
{
if (viz[x] && capacitate[x][n]>flux[x][n])
{
tata[n] = x;
int copie = n;
int minim = 1<<30;
while (copie != 1)
{
minim = min(minim, capacitate[tata[copie]][copie]-flux[tata[copie]][copie]);
copie = tata[copie];
}
copie = n;
while (copie != 1)
{
flux[tata[copie]][copie]+=minim;
flux[copie][tata[copie]]-=minim;
copie = tata[copie];
}
raspuns+=minim;
}
}
memset(viz, 0, sizeof(viz));
memset(tata, 0, sizeof(tata));
}
fout << raspuns;
return 0;
}