Pagini recente » Borderou de evaluare (job #2007457) | Cod sursa (job #2123662)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,i,j,min1,flux,t[1001],c[1001][1001],f[1001][1001];
bool v[1001];
vector <int> fr,a[1001];
vector <int>::iterator it;
int bfs()
{
int i;
queue <int> b;
b.push(1);
v[1]=1;
for(i=2;i<=n;i++)
v[i]=0;
while(b.size())
{
i=b.front();
for(it=a[i].begin();it!=a[i].end();it++)
if(!v[*it] && c[i][*it]-f[i][*it]>0)
{
b.push(*it);
v[*it]=1;
t[*it]=i;
if(*it==n)
return 1;
}
b.pop();
}
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
while(m)
{
scanf("%d %d %d",&i,&j,&flux);
c[i][j]=flux;
a[i].push_back(j);
a[j].push_back(i);
if(j==n)
fr.push_back(i);
m--;
}
flux=0;
while(bfs())
for(it=fr.begin();it!=fr.end();it++)
if(v[*it] && c[*it][n]-f[*it][n]>0)
{
t[n]=*it;
min1=110001;
j=n;
while(j!=1)
{
min1=min(min1,c[t[j]][j]-f[t[j]][j]);
j=t[j];
}
j=n;
while(j!=1)
{
f[t[j]][j]+=min1;
f[j][t[j]]-=min1;
j=t[j];
}
flux+=min1;
}
printf("%d\n",flux);
return 0;
}