Pagini recente » Cod sursa (job #1728995) | Cod sursa (job #2485953) | Cod sursa (job #2539963) | Cod sursa (job #906912) | Cod sursa (job #2204964)
#include <bits/stdc++.h>
#define MAXN 1001
using namespace std;
int c[MAXN][MAXN],f[MAXN][MAXN];
vector<vector<int> > la;
vector<bool> viz;
vector<int> tata;
int n,m,Minim;
queue<int> coada;
int cost(int x,int y)
{
if(!x) return 0;
return c[x][y]-f[x][y];
}
void AfiseazaLant(const vector<int>& tata,int nod)
{
if(nod!=0)
{
AfiseazaLant(tata,tata[nod]);
cout<<nod<<' ';
}
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>n>>m;
la.resize(n+1);
for(int i=0; i<m; ++i)
{
int x,y;
fin>>x>>y;
fin>>c[x][y];
la[x].push_back(y);
la[y].push_back(x);
}
Minim=1;
while(Minim)
{
viz.resize(n+1,0);
tata.resize(n+1,0);
coada.push(1);
viz[1]=true;
while(!coada.empty() && !viz[n])
{
int nod=coada.front();
coada.pop();
for(int i=0; i<la[nod].size(); ++i)
if(!viz[la[nod][i]] && cost(nod,la[nod][i]))
{
tata[la[nod][i]]=nod;
viz[la[nod][i]]=true;
coada.push(la[nod][i]);
if(la[nod][i]==n) break;
}
}
Minim=cost(tata[n],n);
///AfiseazaLant(tata,n);
//cout<<endl;
int aux=tata[n];
while(tata[aux]!=0)
{
Minim=min(Minim,cost(tata[aux],aux));
aux=tata[aux];
}
aux=n;
while(tata[aux]!=0)
{
f[tata[aux]][aux]+=Minim;
f[aux][tata[aux]]-=Minim;
aux=tata[aux];
}
viz.clear();
tata.clear();
while(!coada.empty()) coada.pop();
};
int flux=0;
for(int i=1; i<=n; ++i)
flux+=f[1][i];
/*for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
cout<<f[i][j]<<' ';
cout<<endl;
}*/
fout<<flux<<'\n';
return 0;
}