Pagini recente » Istoria paginii runda/road_to_ioi_6/clasament | Cod sursa (job #1587843) | Monitorul de evaluare | Cod sursa (job #176721) | Cod sursa (job #2482368)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
bool vizitat[1005];
int parinti[1005];
int v[1005][1005];
queue <int> coada;
int flux , flux_max , curent;
void stabilire_flux(int n)
{
flux=110005;
int fiu=n, tata;
while(fiu!=1)
{
tata =parinti[fiu];
flux= min( v[tata][fiu] , flux);
fiu =tata;
}
fiu=n;
while(fiu!=1)
{
tata =parinti[fiu];
v[tata][fiu] -= flux;
v[fiu][tata] += flux;
fiu =tata;
}
flux_max=flux_max +flux;
}
void golire_coada()
{
while(!coada.empty())
coada.pop();
}
bool gasire_drum(int n)
{
int i;
for(i=1;i<=n;i++)
{
parinti[i]=0;
vizitat[i]=0;
}
coada.push(1);
while(!coada.empty())
{
curent =coada.front();
coada.pop();
vizitat[curent]=1;
for(i=1;i<n;i++)
if(v[curent][i]!=0 && vizitat[i]==0)
{
parinti[i]=curent;
coada.push(i);
}
if(v[curent][i]!=0)
{
parinti[i]=curent;
stabilire_flux(n);
return true;
}
}
return false;
}
int main()
{
int n,m,i,x,y,c;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
v[x][y]=c;
}
while(gasire_drum(n))
golire_coada();
fout<<flux_max;
return 0;
}