Pagini recente » Cod sursa (job #2403650) | Cod sursa (job #766198) | Cod sursa (job #3148403) | Cod sursa (job #281443) | Cod sursa (job #2938307)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
///#include <tryhardmode>
///#include <GOMDODE::ON>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1e3+5;
const int MAXVAL=1e9;
vector<int>v[NMAX];
int flux[NMAX][NMAX];
int t[NMAX];
bool viz[NMAX];
int n;
bool bfs(int p)
{
int i;
queue<int>q;
for(i=1;i<=n;i++)
{
t[i]=0;
viz[i]=0;
}
q.push(1);
viz[1]=true;
while(!q.empty())
{
p=q.front();
q.pop();
if(p==n)
return true;
for(auto i:v[p])
{
if(!viz[i] && flux[p][i]>0)
{
q.push(i);
viz[i]=1;
t[i]=p;
}
}
}
return false;
}
int main()
{
int i,j,m,a,b,c,minim,x;
long long maxim=0;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
flux[a][b]=c;
v[a].push_back(b);
v[b].push_back(a);
}
while(bfs(1))
{
for(auto i:v[n])
{
if(!viz[i])
continue;
if(flux[i][n]<=0)
continue;
minim=MAXVAL;
t[n]=i;
x=n;
while(x!=1)
{
minim=min(minim,flux[t[x]][x]);
x=t[x];
}
if(minim==0)
continue;
maxim=maxim+minim;
x=n;
while(x!=1)
{
flux[x][t[x]]=flux[x][t[x]]+minim;
flux[t[x]][x]=flux[t[x]][x]-minim;
x=t[x];
}
}
}
fout<<maxim;
return 0;
}