Pagini recente » Cod sursa (job #2509651) | Cod sursa (job #998357) | Cod sursa (job #923777) | Cod sursa (job #344762) | Cod sursa (job #274723)
Cod sursa(job #274723)
#include<stdio.h>
#include<vector>
using namespace std;
FILE*fin=fopen("maxflow.in","r");
FILE*fout=fopen("maxflow.out","w");
#define nm 1005
#define inf 0x3f3f3f3f
#define pb push_back
#define min(a,b)((a)<(b)?(a):(b))
vector<int> g[nm];
int n,m, viz[nm],c[nm][nm],f[nm][nm],t[nm],q[nm];
inline int bf()
{
int i,j,nod,nnod;
memset(viz,0,sizeof(viz));
q[0]=1;q[1]=1;i=1;
while(i<=q[0])
{
nod=q[i];
if(nod!=n)
{
for(j=0;j<g[nod].size();j++)
{
nnod=g[nod][j];
if(!viz[nnod]&&(c[nod][nnod]-f[nod][nnod]))
{
viz[nnod]=1;
t[nnod]=nod;
q[0]++;
q[q[0]]=nnod;
}
}
}
i++;
}
return viz[n];
}
int main()
{
int i,flow=0,fmin,x,y,z,nod;
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&x,&y,&z);
c[x][y]=z;
g[x].pb(y);
g[y].pb(x);
}
while(bf())
for(i=0;i<g[n].size();i++)
{
nod=g[n][i];
if(viz[nod]&&(c[nod][n]-f[nod][n]))
{
t[n]=nod;
nod=n;
fmin=inf;
while(nod>1)
{
fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
if(!fmin) continue;
nod=n;
while(nod>1)
{
f[t[nod]][nod]+=fmin;
f[nod][t[nod]]-=fmin;
nod=t[nod];
}
flow+=fmin;
}
}
fprintf(fout,"%d",flow);
fclose(fin);
fclose(fout);
return 0;
}