Pagini recente » Cod sursa (job #2628158) | Cod sursa (job #2049972) | Cod sursa (job #930691) | Cod sursa (job #1349091) | Cod sursa (job #1259907)
#include <cstdio>
#include <vector>
#include <cstring>
#define INF 900000
using namespace std;
vector <int> g[1001];
int flux[1001][1001], capacitate[1001][1001], tata[1001], q[1001], n, sol=0;
int min (int x, int y)
{
if (x<y) return x;
return y;
}
int bfs (void)
{
int p=1, u=1, nod, i;
memset(tata,0,sizeof(tata)); tata[1]=-1;
memset(q,0,sizeof(q)); q[0]=1; q[1]=1;
while (p<=u)
{
nod=q[p];
for (i=0; i<g[nod].size(); i++)
{
if (tata[g[nod][i]]==0 && flux[nod][g[nod][i]]<capacitate[nod][g[nod][i]])
{
q[++u]=g[nod][i];
tata[g[nod][i]]=nod;
if (g[nod][i]==n)
{
return 1;
}
}
}
p++;
}
return 0;
}
void flux_maxim (void)
{
int i, j, r;
while (bfs()!=0)
{
for (i=0; i<g[n].size(); i++)
{
if (tata[g[n][i]]==-1 || capacitate[g[n][i]][n]<=flux[g[n][i]][n]) continue;
r=INF; tata[n]=g[n][i];
for (j=n; j>1; j=tata[j])
{
r=min(r,capacitate[tata[j]][j]-flux[tata[j]][j]);
}
if (r<=0) continue;
for (j=n; j>1; j=tata[j])
{
flux[tata[j]][j]+=r;
flux[j][tata[j]]-=r;
}
sol+=r;
}
}
}
int main()
{
int m, i, x, y, z;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
capacitate[x][y]=z;
g[x].push_back(y);
g[y].push_back(x);
}
flux_maxim();
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}