Pagini recente » Cod sursa (job #2635890) | Cod sursa (job #344751) | Cod sursa (job #968912) | Cod sursa (job #1360118) | Cod sursa (job #2164585)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
int ma[1002][1002];
int gri[1002],gre[1002],viz[1002],tata[1002],drum[1002];
int n,m,a,b,c,q,w,sol,mi,cop,ok,no,k;
queue <int> coada;
void bfs()
{
while(!coada.empty())
{
no=coada.front();
coada.pop();
viz[no]=1;
for(int i=1;i<=n;i++)
{
if(ma[no][i]>0&&!viz[i])
{
tata[i]=no;
if(i==n)
{
viz[n]=1;
return;
}
coada.push(i);
}
}
}
}
void construire_drum()
{
k=0;
cop=n;
mi=0;
while(tata[cop])
{
if(mi==0||ma[tata[cop]][cop]<mi)
{
mi=ma[tata[cop]][cop];
}
drum[++k]=cop;
cop=tata[cop];
}
drum[++k]=1;
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
in>>n>>m;
for(int i=1;i<=m;i++)
{
in>>a>>b>>c;
ma[a][b]=c;
gri[b]++;
gre[a]++;
}
sol=0;
ok=1;
coada.push(1);
bfs();
while(viz[n])
{
construire_drum();
sol+=mi;
for(int i=1;i<k;i++)
{
ma[drum[i+1]][drum[i]]-=mi;
}
for(int i=1;i<=n;i++)
{
viz[i]=0;
}
while(!coada.empty())
{
coada.pop();
}
coada.push(1);
bfs();
}
out<<sol;
return 0;
}