Cod sursa(job #1114012)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 21 februarie 2014 10:13:50
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#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;
}*/
int BFS()
{
    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.front();
        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=BFS();
    while (flow)
    {
        Total+=flow;
        flow=BFS();
    }
}
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;
}