Pagini recente » Cod sursa (job #2771617) | Cod sursa (job #376063) | Cod sursa (job #2463076) | Cod sursa (job #1568255) | Cod sursa (job #2237842)
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 1024
#define inf 110000000
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,c[nmax][nmax], fx[nmax][nmax], t[nmax], viz[nmax];
vector < int > v[nmax];
queue <int> q;
void citire()
{
int i,j,k,ct;
f>>n>>m;
for(k=1; k<=m; k++)
{
f>>i>>j>>ct;
c[i][j]=ct;
v[i].push_back(j);
v[j].push_back(i);
}
}
int bfs()
{// returneaza 1 daca exista drum pana la destinatie
int nod,i;
while(!q.empty())
q.pop();
for(i=1; i<=n; i++)
viz[i]=0;
viz[1]=1;
q.push(1);
while(!q.empty())
{
nod=q.front();
q.pop();
for(i=0; i<v[nod].size(); i++)
if(viz[v[nod][i]]==0 && c[nod][v[nod][i]]>fx[nod][v[nod][i]])
{
viz[v[nod][i]]=1;
t[v[nod][i]]=nod;
q.push(v[nod][i]);
if(v[nod][i]==n)
return 1;
}
}
return 0;
}
int main()
{
citire();
int nod, flux, fmin;
for(flux=0; bfs(); flux+=fmin)
{
fmin=inf;
for(nod=n; nod!=1; nod=t[nod])
fmin=min(fmin, c[t[nod]][nod] - fx[t[nod]][nod]);
for(nod=n; nod!=1; nod=t[nod])
{
fx[nod][t[nod]] -= fmin;
fx[t[nod]][nod] += fmin;
}
}
cout<<flux<<endl;
f.close();
g.close();
return 0;
}