Pagini recente » Cod sursa (job #257562) | Cod sursa (job #1770110) | Cod sursa (job #1360609) | Cod sursa (job #1365685) | Cod sursa (job #339801)
Cod sursa(job #339801)
#include<cstdio>
#include<vector>
#define MIN(a,b) (a)<(b)?(a):(b)
int n,m,i,j,C[1001][1001],F[1001][1001],t[1001],flow,min;
std::vector<int> a[1001];
int q[1001],st,dr;
int BF()
{
memset(t,0,sizeof(t));
st = dr = 1;
q[1] = 1;
int i,x;
t[1] = -1;
while(st<=dr)
{
x = q[st];
for(i = 0;i<a[x].size();++i)
if(!t[a[x][i]] && C[x][a[x][i]] != F[x][a[x][i]])
{
q[++dr] = a[x][i];
t[a[x][i]] = x;
}
++st;
}
return t[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(int x,y,z;m;--m)
{
scanf("%d %d %d",&x,&y,&z);
a[x].push_back(y);
a[y].push_back(x);
C[x][y] += z;
}
for(;BF();)
{
for(i=1;i<n;++i)
if(t[i] && C[i][n] != F[i][n])
{
min = C[i][n] - F[i][n];
j = i;
while(j!=1 && min)
{
min = MIN(min,C[t[j]][j] - F[t[j]][j]);
j = t[j];
}
if(min)
{
flow += min;
F[i][n] += min;
F[n][i] -= min;
j=i;
while(j!=1)
{
F[t[j]][j] += min;
F[j][t[j]] -= min;
j = t[j];
}
}
}
}
printf("%d",flow);
fclose(stdout);
return 0;
}