Pagini recente » Cod sursa (job #520679) | Cod sursa (job #1395222) | Cod sursa (job #136834) | Cod sursa (job #460686) | Cod sursa (job #1113998)
#include <cstdio>
#include <algorithm>
#include <queue>
#define mp make_pair
#define INF 999999999
#define N_MAX 1001
using namespace std;
int i, N, M, Capacity[N_MAX][N_MAX], Flow[N_MAX][N_MAX], Total;
int PFS()
{
priority_queue< pair< int, pair<int, int> > > H;
int i, Use[N_MAX], T[N_MAX], FLUX=0, nod;
for (i=1; i<=N; i++) Use[i]=0,T[i]=-1;
Use[1]=1;
H.push(mp(INF, mp(1, -1) ) );
while (!H.empty())
{
pair<int, pair<int, int> > X=H.top();
H.pop();
int flux=X.first, nod=X.second.first, tata=X.second.second;
Use[nod]=1;
T[nod]=tata;
if (nod==N) {FLUX=flux;break;}
for (i=1; i<=N; i++)
if (Capacity[nod][i]-Flow[nod][i]>0 && !Use[i])
H.push(mp( min(flux, Capacity[nod][i]-Flow[nod][i]), mp(i, nod) ) );
}
nod=N;
while (T[nod]>-1)
{
Flow[T[nod]][nod]+=FLUX;
Flow[nod][T[nod]]-=FLUX;
nod=T[nod];
}
return FLUX;
}
void max_flow()
{
int flow=PFS();
while (flow)
{
Total+=flow;
flow=PFS();
}
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i=1; i<=M; i++)
{
int x, y, cost;
scanf("%d%d%d", &x, &y, &cost);
Capacity[x][y]=cost;
}
max_flow();
printf("%d", Total);
return 0;
}