Pagini recente » Cod sursa (job #264657) | Cod sursa (job #364290) | Cod sursa (job #417349) | Cod sursa (job #2206245) | Cod sursa (job #866535)
Cod sursa(job #866535)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int c[1111],n,m,pred[1111],x[1111][1111];
bool fol[1111];
vector<int> a[1111];
inline int minim(int a,int b)
{
return a<b ? a:b;
}
bool bfs()
{
int st,dr,i;
st=dr=1;
c[1]=1;
for(i=2;i<=n;++i)
fol[i]=false;
fol[1]=true;
while(st<=dr && c[st]!=n)
{
for(i=0;i<a[c[st]].size();++i)
{
if(fol[a[c[st]][i]]==false && x[c[st]][a[c[st]][i]]>0)
{
c[++dr]=a[c[st]][i];
pred[c[dr]]=c[st];
fol[a[c[st]][i]]=true;
}
}
++st;
}
if(c[st]==n)
{
return true;
}
return false;
}
int flux_maxim(int poz)
{
if(pred[poz]==0)
return 2000000000;
return minim(flux_maxim(pred[poz]),x[pred[poz]][poz]);
}
void actualizeaza(int p)
{
int poz;
poz=n;
while(pred[poz]!=0)
{
x[pred[poz]][poz]-=p;
x[poz][pred[poz]]+=p;
poz=pred[poz];
}
}
int main()
{
int i,p,q,r,s;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
in>>n>>m;
for(i=1;i<=m;++i)
{
in>>p>>q>>r;
a[p].push_back(q);
a[q].push_back(p);
x[p][q]=r;
}
s=0;
while(bfs())
{
p=flux_maxim(n);
actualizeaza(p);
s+=p;
}
out<<s;
return 0;
}