Pagini recente » Cod sursa (job #97130) | Monitorul de evaluare | Istoria paginii utilizator/anny95 | Istoria paginii probleme-de-taietura | Cod sursa (job #417040)
Cod sursa(job #417040)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N = 1<<10;
const int oo = 1<<18;
int n,S,D,c[N][N],f[N][N],pred[N],coada[N];
vector<int> a[N];
void citire()
{
int m,x,y,z;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
c[x][y] = z;
a[x].push_back(y);
a[y].push_back(x);
}
S = 1;
D = n;
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
int minim(int x)
{
int r = oo;
while(x != S)
{
r = min(r,c[pred[x]][x]-f[pred[x]][x]);
x = pred[x];
}
return r;
}
void drum(int x,int r)
{
while(x != S)
{
f[pred[x]][x] += r;
f[x][pred[x]] -= r;
x = pred[x];
}
}
bool bf()
{
int p,u,x,y;
p = u = 0;
coada[u++] = S;
memset(pred,0,sizeof(pred));
while(p != u)
{
x = coada[p++];
for(size_t i=0 ; i<a[x].size() ; ++i)
{
y = a[x][i];
if(pred[y]==0 && f[x][y] < c[x][y])
{
coada[u++] = y;
pred[y] = x;
}
}
}
return (bool)pred[D];
}
int flux()
{
int fl=0,x,r;
while(bf())
{
for(size_t i=0 ; i<a[D].size() ; ++i)
{
x = a[D][i];
if(pred[x] == 0 || f[x][D] >= c[x][D])
continue;
r = c[x][D] - f[x][D];
r = min(r,minim(x));
drum(x,r);
f[x][D] += r;
f[D][x] -= r;
fl += r;
}
}
return fl;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citire();
printf("%d\n",flux());
return 0;
}