Pagini recente » Cod sursa (job #1189972) | Cod sursa (job #1992732) | Cod sursa (job #715325) | Cod sursa (job #1042489) | Cod sursa (job #2479435)
#include <bits/stdc++.h>
#define Nmax 1005
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int viz[Nmax], f[Nmax][Nmax], c[Nmax][Nmax], l[Nmax], lg, n, m, x, y, i, j, flux;
vector <int> vo[Nmax];
vector <int> vi[Nmax];
void bfs()
{
int i, u;
queue <int> q;
q.push(1); viz[1]=1;
while(!q.empty()&&!viz[n])
{
u=q.front();
q.pop();
for(i=0;i<vo[u].size();i++)
if(!viz[vo[u][i]]&&f[u][vo[u][i]]<c[u][vo[u][i]])
{
viz[vo[u][i]]=u;
q.push(vo[u][i]);
}
for(i=0;i<vi[u].size();i++)
if(!viz[vi[u][i]]&&f[vi[u][i]][u])
{
viz[vi[u][i]]=-u;
q.push(vi[u][i]);
}
}
}
int main()
{
fin >> n >> m;
for(i=1;i<=m;i++)
{
fin >> x >> y;
fin >> c[x][y];
vo[x].push_back(y);
vi[y].push_back(x);
}
l[0]=n;
do
{
bfs();
if(!viz[n])
break;
lg=0;
int a, b; a=b=INT_MAX;
while(l[lg]!=1)
{
l[++lg]=viz[l[lg-1]];
if(l[lg]>0)
a=min(a, c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
else
b=min(b, f[l[lg-1]][-l[lg]]);
}
int v=min(a, b);
for(i=lg;i>=1;i--)
{
if(l[i]>0)
f[l[i]][l[i-1]]+=v;
else f[l[i-1]][-l[i]]-=v;
}
for(i=1;i<=n;i++)
viz[i]=0;
}while(1);
for(i=0;i<vo[1].size();i++)
flux+=f[1][vo[1][i]];
fout << flux;
return 0;
}