Pagini recente » Cod sursa (job #2723773) | Cod sursa (job #270124) | Cod sursa (job #2832399) | Cod sursa (job #927286) | Cod sursa (job #428357)
Cod sursa(job #428357)
#include<fstream>
#include<vector>
#define MAX 100000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> v[1001];
int n,m,S,T,flow;
int c[1001][1001],f[1001][1001],x[1001],t[1001],pus[1001],r[1001];
void augment()
{ int j=T,i;
while(j!=S)
{ i=abs(t[j]);
if(t[j]>=0) f[i][j]+=r[T];
else f[j][i]-=r[T];
j=i;
}
flow+=r[T];
}
int bf()
{ int st=1,dr=1,i,nod;
unsigned int j;
for(i=1;i<=T;i++)
{ t[i]=0;
pus[i]=0;
x[i]=0;
}
x[1]=S;
pus[S]=1;
r[S]=MAX;
while(st<=dr)
{ nod=x[st];
for(j=0;j<v[x[st]].size();j++)
{ i=v[nod][j];
if(pus[i]==0)
{ if(c[nod][i]>f[nod][i])
{ x[++dr]=i;
pus[i]=1;
t[i]=nod;
if(c[nod][i]-f[nod][i]<r[nod])
r[i]=c[nod][i]-f[nod][i];
else r[i]=r[nod];
if(i==T) return 1;
}
if(f[i][nod])
{ x[++dr]=i;
pus[i]=1;
t[i]=-nod;
if(f[i][nod]<r[nod])
r[i]=f[i][nod];
else r[i]=r[nod];
if(i==T) return 1;
}
}
}
st++;
}
return 0;
}
void flux()
{ while(bf())
augment();
}
int main()
{ int i,x,y,z;
fin>>n>>m;
for(i=1;i<=m;i++)
{ fin>>x>>y>>z;
c[x][y]=z;
v[x].push_back(y);
v[y].push_back(x);
}
S=1;
T=n;
flux();
fout<<flow;
fin.close();
fout.close();
return 0;
}