Pagini recente » Cod sursa (job #455165) | Borderou de evaluare (job #2022982) | Cod sursa (job #2158326) | Cod sursa (job #1967246) | Cod sursa (job #1397823)
//Flux Maxim maxflow cu Ford-Fulkerson -- foloeste notiunea de michie reziduala pentru a gasi solutia optima
//https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-1/
#include <fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,i,j,a,capacitate,fluxmax,cost[1010][1010],b,c,aux,x,tata[1010];
vector<int> v[1010];
queue<int> q;
int bfs()
{
for(i=1;i<=n;++i) tata[i]=0;
q.push(1);
while(!q.empty())
{
aux=q.front();
q.pop();
for(i=0;i<(int)v[aux].size();++i)
{
if(tata[v[aux][i]]==0&&cost[aux][v[aux][i]]>0)
{
tata[v[aux][i]]=aux;
q.push(v[aux][i]);
}
}
}
return tata[n]; // 0 daca nu mai exista drum de la start la finish
}
int main()
{
fin>>n>>m;
for(i=1;i<=m;++i)
{
fin>>a>>b>>c;
cost[a][b]=c;
//PARTICULAR: PENTRU CA ALGORITMUL SA FUNCIONEZE daca exista muchia b-a si trebuie sa adaugam a-b, creeam un nou nod c si avem muchie a-c, c-b
v[a].push_back(b);
v[b].push_back(a);
}
while(bfs()) // cat timp exista un drum de la start(1) la finish(n) creeam vectorul de tati
{
for(j=0;j<(int)v[n].size();++j) //pentru fiecare lant
{
x=v[n][j];
if(cost[x][n]>0&&tata[x])
{
capacitate=cost[x][n];
for(i=x;i!=1;i=tata[i]) capacitate=min(capacitate,cost[tata[i]][i]);
for(i=x;i!=1;i=tata[i])
{
cost[tata[i]][i]-=capacitate;
cost[i][tata[i]]+=capacitate;
}
cost[x][n]-=capacitate;
fluxmax+=capacitate;
}
}
}
fout<<fluxmax;
return 0;
}