Pagini recente » Cod sursa (job #2553878) | Cod sursa (job #2936391) | Cod sursa (job #3251434) | Cod sursa (job #525341) | Cod sursa (job #2815608)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define flowmax 1005
vector<int> lista_adiacenta[flowmax];
bool BFSflow(int s, int fin, int f[flowmax][flowmax], int c[flowmax][flowmax], int tata[flowmax])
{
bool vizitat[flowmax]={false};
queue<int> q;
q.push(s);
vizitat[s] = true;
while(!q.empty())
{
int nod = q.front();
q.pop();
for(auto i : lista_adiacenta[nod])
{
if(c[nod][i]-f[nod][i]>0 and vizitat[i] == false)
{
vizitat[i] = true;
q.push(i);
tata[i] = nod;
if(i == fin)
return true;
}
}
}
return false;
}
int main()
{
int f[flowmax][flowmax]={0};
int c[flowmax][flowmax]={0};
int tata[flowmax]={0};
int n, m;
fin >> n >> m;
for(int i = 1; i <= m; ++i)
{
int a, b, fluxx;
fin >> a >> b >> fluxx;
lista_adiacenta[a].push_back(b);
lista_adiacenta[b].push_back(a);
c[a][b] = fluxx;
}
int flow = 0;
while(BFSflow(1,n,f,c,tata)==true)
{
int fmin = INT_MAX;
int nod = n;
while(nod != 1)
{
fmin = min(fmin, c[tata[nod]][nod] - f[tata[nod]][nod]);
nod = tata[nod];
}
flow += fmin;
nod = n;
while(nod != 1)
{
f[tata[nod]][nod] += fmin;
f[nod][tata[nod]] -= fmin;
nod = tata[nod];
}
}
fout << flow;
return 0;
}