Pagini recente » Cod sursa (job #1743557) | Cod sursa (job #1041658) | Cod sursa (job #2872303) | Cod sursa (job #1150483) | Cod sursa (job #417774)
Cod sursa(job #417774)
//dinic
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
FILE *in,*out;
vector<int> a[1050];
int n,nrfi,b[1050],cap[1050][1050];
int pred[1050],q[1050],rez;
int inc_flux(int fiu)
{
int vflux,y;
vflux=cap[fiu][n];
y=fiu;
while (y!=1)
{
if (cap[pred[y]][y]<vflux)
vflux=cap[pred[y]][y];
y=pred[y];
}
y=fiu;
cap[fiu][n]-=vflux;
cap[n][fiu]+=vflux;
while (y!=1)
{
cap[pred[y]][y]-=vflux;
cap[y][pred[y]]+=vflux;
y=pred[y];
}
return vflux;
}
int flux()
{
int p,u,d,i;
memset(pred,0,sizeof(pred));
p=u=1;
q[p]=1;
while (p<=u)
{
for(i=0;i<a[q[p]].size();i++)
if (!pred[a[q[p]][i]]&&cap[q[p]][a[q[p]][i]]>0)
{
u++;
q[u]=a[q[p]][i];
pred[a[q[p]][i]]=q[p];
}
p++;
}
if (!pred[n])
return 0;
d=0;
for (i=1;i<=nrfi;i++)
{
if (pred[b[i]]&&cap[b[i]][n]>0)
{
d=1;
rez+=inc_flux(b[i]);
}
}
return d;
}
int main()
{
int m,x,y,z,i;
FILE *in,*out;
in=fopen("maxflow.in","r");
out=fopen("maxflow.out","w");
fscanf(in,"%d%d",&n,&m);
for (i=1;i<=m;i++)
{
fscanf(in,"%d%d%d",&x,&y,&z);
a[x].pb(y);
a[y].pb(x);
cap[x][y]=z;
if (y==n)
{
nrfi++;
b[nrfi]=x;
}
}
while (flux());
fprintf(out,"%d\n",rez);
fclose(in);
fclose(out);
return 0;
}