Pagini recente » Cod sursa (job #2980201) | Cod sursa (job #232690) | Cod sursa (job #1030633) | Cod sursa (job #3040197) | Cod sursa (job #1557166)
//Flux maxim intr-o retea de transport
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#include <cstring>
#define NMax 1001
using namespace std;
vector<int> Graf[NMax];
int N,M,Cap[NMax][NMax],flux[NMax][NMax];
int tata[NMax],sol,x,y,z;
deque<int> Q;
bool mark[NMax];
void Read()
{
scanf("%d%d",&N,&M);
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&z);
Graf[x].push_back(y);
Graf[y].push_back(x);
Cap[x][y]=z;
}
}
int BFS()//Construiesc arborele BFS
{
memset(tata,0,sizeof(tata));
memset(mark,false,sizeof(mark));
Q.push_back(1);
while(Q.empty()==false)
{
int nod=Q.front();
Q.pop_front();
for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
{
int vecin=*it;
if(Cap[nod][vecin]>flux[nod][vecin] && mark[vecin]==false)
{
mark[vecin]=true;
Q.push_back(vecin);
tata[vecin]=nod;
}
}
}
return mark[N];
}
void Edmonds_Karp()
{
while(BFS())
{
for(int i=1;i<=N;i++)
{
if(Cap[i][N]>flux[i][N] && tata[i])
{
int fmin=Cap[i][N]-flux[i][N];
for(int j=i;j!=1;j=tata[j])
fmin=min(fmin,(Cap[tata[j]][j]-flux[tata[j]][j]));
for(int j=i;j!=1;j=tata[j])
{
flux[tata[j]][j]=flux[tata[j]][j]+fmin;
flux[j][tata[j]]=flux[j][tata[j]]-fmin;
}
flux[i][N]+=fmin;
flux[N][i]-=fmin;
sol=sol+fmin;
}
}
}
printf("%d",sol);
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
Read();
Edmonds_Karp();
}