Pagini recente » Cod sursa (job #1751780) | Cod sursa (job #491467) | Cod sursa (job #1384732) | Cod sursa (job #1892718) | Cod sursa (job #1284094)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#define NMAX 1005
#define INF (1LL<<31)-1;
using namespace std;
int n, m, pred[NMAX], c[NMAX][NMAX], f[NMAX][NMAX], i, u, v, cap;
bool viz[NMAX];
vector<int> g[NMAX];
int BFS()
{
int p;
queue<int> q;
memset(viz,0,sizeof(viz));
q.push(1);
viz[1]=1;
while(!q.empty())
{
p=q.front();
if(p==n)
return 1;
for(vector <int>::iterator it=g[p].begin(); it!=g[p].end(); ++it)
if(!viz[*it]&&c[p][*it]>f[p][*it])
{
viz[*it]=1;
pred[*it]=p;
q.push(*it);
}
q.pop();
}
return 0;
}
int main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin>>n>>m;
for(i=1; i<=m; i++)
{
cin>>u>>v>>cap;
c[u][v]+=cap;
g[u].push_back(v);
g[v].push_back(u);
}
int fx=0, minim;
while(BFS())
{
for(vector<int>::iterator it=g[n].begin(); it!=g[n].end(); ++it)
if(f[*it][n]<c[*it][n]&&viz[*it])
{
pred[n]=*it;
int minim=INF;
for(i=n; i!=1; i=pred[i])
if(minim>c[pred[i]][i]-f[pred[i]][i])
minim=c[pred[i]][i]-f[pred[i]][i];
for(i=n; i!=1; i=pred[i])
{
f[pred[i]][i]+=minim;
f[i][pred[i]]-=minim;
}
fx+=minim;
}
}
cout<<fx<<'\n';
return 0;
}