Pagini recente » Cod sursa (job #1100415) | Cod sursa (job #2518247) | Cod sursa (job #1428994) | Cod sursa (job #1780986) | Cod sursa (job #2168118)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1002
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int c[nmax][nmax],f[nmax][nmax],viz[nmax],oto[nmax],x,y,val,n,m,flux;
vector <int> graf[nmax];
queue <int> coada;
int bfs()
{
for(int i=1;i<=n;i++)
viz[i]=0;
coada.push(1);
viz[1]=1;
while(!coada.empty())
{
int nod=coada.front();
coada.pop();
if(nod==n)
continue;
for(int i=0;i<graf[nod].size();i++)
{
int v=graf[nod][i];
if(c[nod][v]==f[nod][v]||viz[v])
continue;
oto[v]=nod;
viz[v]=1;
coada.push(v);
}
}
return viz[n];
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>val;
c[x][y]=val;
graf[x].push_back(y);
graf[y].push_back(x);
}
while(bfs())
{
for(int i=0;i<graf[n].size();i++)
{
int v=graf[n][i];
if(c[v][n]==f[v][n]||!viz[v])
continue;
oto[n]=v;
int nod=n;
int mini=1000002;
while(nod!=1)
{
mini=min(mini,c[oto[nod]][nod]-f[oto[nod]][nod]);
nod=oto[nod];
}
if(mini==0)
continue;
nod=n;
flux+=mini;
while(nod!=1)
{
f[oto[nod]][nod]+=mini;
f[nod][oto[nod]]-=mini;
nod=oto[nod];
}
}
}
fout<<flux;
return 0;
}