Pagini recente » Cod sursa (job #1998601) | Cod sursa (job #2042521) | Cod sursa (job #1191295) | Cod sursa (job #2799271) | Cod sursa (job #2207263)
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <list<int> > graf;
int flux[1001][1001], capacitate[1001][1001];
vector <int> parinte;
bool BFS (int dest)
{
vector <bool> viz;
viz.resize(dest+1);
queue <int> parcurgere;
viz[1] = true;
parcurgere.push(1);
while(!parcurgere.empty())
{
int nod = parcurgere.front();
parcurgere.pop();
for(auto j: graf[nod])
{
if(viz[j] == true || flux[nod][j] == capacitate[nod][j] )
continue;
else
{
parinte[j] = nod;
parcurgere.push(j);
viz[j] = true;
if(j == dest)
return true;
}
}
}
return false;
}
int main()
{
int n, m;
fin>>n>>m;
graf.resize(n+1);
parinte.resize(n+1);
int i;
int a, b, c;
for(i=1; i<=m; i++)
{
fin>>a>>b>>c;
graf[a].push_back(b);
capacitate[a][b] += c; //in cazul in care avem muchii dublate
graf[b].push_back(a);
//daca nu ar fi fost si muchii inverse aici am fi pus sa ia capacitatea 0
}
///sursa e nodul 1
///destinatia e nodul n
int flux_maxim=0;
while(BFS(n))
{
int cap_min=5000;
for(int i=n; i != 1; i= parinte[i])
{
cap_min = min(cap_min, capacitate[parinte[i]][i] - flux[parinte[i]][i]);
}
for(int i=n; i != 1; i= parinte[i])
{
flux[parinte[i]][i] += cap_min;
flux[i][parinte[i]] -= cap_min;
}
flux_maxim += cap_min;
}
fout<<flux_maxim;
}