Pagini recente » Cod sursa (job #53260) | Cod sursa (job #2467659) | Cod sursa (job #2537306) | Cod sursa (job #2724165) | Cod sursa (job #1478804)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define NMAX 1003
#define INF 510000
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int c[NMAX][NMAX],f[NMAX][NMAX],viz[NMAX],cd[NMAX],tt[NMAX];
vector<int> a[NMAX];
queue<int> coada;
queue<int> em;
int n,m,x,y,cost;
void citire()
{
in >> n >> m;
for(int i=0;i<m;i++)
{
in >> x >> y >> cost;
c[x][y] += cost;
a[x].push_back(y);
a[y].push_back(x);
}
}
int BFS()
{
int nod,fiu;
coada = em;
coada.push(1);
for(int i=1;i<=n;i++)
viz[i]=0;
viz[1]= 1;
while(!coada.empty())
{
nod = coada.front(); coada.pop();
if(nod == n){
return 1;
}
for(int i=0;i<a[nod].size();i++)
{
fiu = a[nod][i];
if(viz[fiu] || c[nod][fiu] == f[nod][fiu]) continue;
viz[fiu] = 1;
coada.push(fiu);
tt[fiu] = nod;
}
}
return 0;
}
void Flow()
{
int flow, fmin,nod;
for(flow=0;BFS();)
{
for(int i=0;i<a[n].size();i++)
{
nod = a[n][i];
if(c[nod][n] == f[nod][n] || !viz[nod]) continue;
tt[n] = nod;
//for(int i=1;i<=n;i++)
// cout << tt[i] << " ";
// cout << endl;
fmin = INF;
for(int i=1;i<=n;i++)
// cout << tt[i] << " ";
// cout << endl;
for(nod = n; nod!=1; nod=tt[nod]){
fmin = min(fmin,c[tt[nod]][nod]-f[tt[nod]][nod]);
}
if(fmin==0) continue;
for(nod = n;nod!=1;nod = tt[nod])
{
f[nod][tt[nod]] -= fmin;
f[tt[nod]][nod] += fmin;
}
flow = flow + fmin;
}
}
out << flow;
}
int main()
{
citire();
Flow();
return 0;
}