Pagini recente » Cod sursa (job #610049) | Cod sursa (job #694650) | Cod sursa (job #2899774) | Cod sursa (job #1424657) | Cod sursa (job #1234957)
#include <fstream>
#include <vector>
#include <queue>
#define lmax 1005
#define inf 20000000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
queue <int>q;
vector <int>v[lmax];
vector <int>::iterator it;
int n,m,x,y,z,i,j,minim,flux;
int tata[lmax];
int d[lmax][lmax],fl[lmax][lmax];
inline bool bf()
{
int nod;
bool ok[lmax];
for (i=1;i<=n;i++)
ok[i]=0;
q.empty();
q.push(1);
ok[1]=1;
while (q.size() && ok[n]==0)
{
nod=q.front();
q.pop();
for (it=v[nod].begin();it<v[nod].end();it++)
if (ok[*it]==0 && d[nod][*it]>fl[nod][*it])
{
ok[*it]=1;
tata[*it]=nod;
q.push(*it);
}
}
return ok[n];
}
int main()
{
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
d[x][y]+=z;
v[x].push_back(y);
}
while (bf())
{
j=n;
minim=inf;
while (j)
{
if (tata[j] && d[tata[j]][j]-fl[tata[j]][j]<minim)
minim=d[tata[j]][j]-fl[tata[j]][j];
j=tata[j];
}
j=n;
while (j)
{
fl[tata[j]][j]+=minim;
fl[j][tata[j]]-=minim;
j=tata[j];
}
flux+=minim;
}
g<<flux;
f.close();
g.close();
}