Pagini recente » Cod sursa (job #705463) | Cod sursa (job #959046) | Cod sursa (job #1044565) | Cod sursa (job #1185638) | Cod sursa (job #1832906)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <string.h>
#define NMax 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N,M;
int Cap[NMax][NMax],flux[NMax][NMax];
int tata[NMax],sol;
vector<int> Graf[NMax];
deque<int> Q;
bool mark[NMax];
void Read();
int 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 EdmondsKarp()
{
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;
}
fout<<sol;
}
int main()
{
Read();
EdmondsKarp();
return 0;
}
void Read()
{
fin>>N>>M;
for(int i=1;i<=M;i++)
{
int from,to,flux;
fin>>from>>to>>flux;
Graf[from].push_back(to);
Graf[to].push_back(from);
Cap[from][to]=flux;
}
}