Pagini recente » Cod sursa (job #3248704) | Cod sursa (job #3184187) | Cod sursa (job #775955) | Cod sursa (job #927284) | Cod sursa (job #573394)
Cod sursa(job #573394)
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
int n,sol,sw[1005],C[1000000],t[1005],flux[1005][1006],cap[1006][1006];
vector <int > v[1005];
int ajunge ()
{
vector<int >:: iterator it;
int s,i,fmax,p,u,k;
p=u=1;
C[1]=1;
memset(sw,0,sizeof(sw));
sw[1]=1;
while(p<=u)
{
for (it=v[C[p]].begin();it<v[C[p]].end();++it)
if (sw[*it]==0 && cap[C[p]][*it]>flux[C[p]][*it])
{
sw[*it]=1;
t[*it]=C[p];
C[++u]=*it;
}
++p;
}
return (sw[n]);
}
int maxflux()
{
vector<int >:: iterator it;
int s,i,fmax,p,u,k;
p=u=1;
C[1]=1;
memset(sw,0,sizeof(sw));
sw[1]=1;
while(p<=u)
{
for (it=v[C[p]].begin();it<v[C[p]].end();++it)
if (sw[*it]==0 && cap[C[p]][*it]>flux[C[p]][*it] )
{
sw[*it]=1;
t[*it]=C[p];
C[++u]=*it;
}
++p;
}
s=0;
for (i=1;i<n;i++)
if (sw[i]==1 && cap[i][n]>flux[i][n])
{
fmax=cap[i][n]-flux[i][n];
for (k=i;k>1;k=t[k])
fmax=min(fmax,cap[t[k]][k]-flux[t[k]][k]);
flux[i][n]+=fmax;
for (k=i;k>1;k=t[k])
{
flux[t[k]][k]+=fmax;
flux[k][t[k]]-=fmax;
}
s+=fmax;
}
return s;
}
void flow()
{
int i;
i=1;sol=0;
while(i!=sol)
{
i=sol;
sol+=maxflux();
}
}
void afisare()
{
ofstream g("maxflow.out");
g<<sol;
g.close();
}
void citire()
{
int i,m,x,y,c;
ifstream f("maxflow.in");
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>c;
cap[x][y]=c;
v[x].push_back(y);
v[y].push_back(x);
}
f.close();
}
int main()
{
citire();
flow();
afisare();
return 0;
}