Cod sursa(job #608737)

Utilizator elfusFlorin Chirica elfus Data 17 august 2011 20:49:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include<stdio.h>
#include<queue>
#include<vector>
#define NMAX 1<<10

using namespace std;

vector<int> L[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX];
bool used[NMAX];

bool BFS(int N)
{
    int now,i;
    queue<int> Q;
    vector<int> :: iterator it;

    for(i=1;i<=N; i++)
    {
        used[i] = 0;
        dad[i] = -1;
    }
    Q.push(1); used[1] = 1;

    while(!Q.empty())
    {
        now = Q.front();
        for( it = L[now].begin(); it != L[now].end() ; it ++)
            if(!used[*it] && F[now][*it] < C[now][*it])
            {
                used[*it] = 1;
                dad[*it] = now;
                Q.push(*it);
            }
        Q.pop();
    }

    return used[N];
}

int main()
{
    int N,M,i,x,y,cost, maxFlow = 0 , flow , now;
    vector<int> :: iterator it;

    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    scanf("%d%d",&N,&M);
    for(i=1;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&cost);
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y] = cost;
    }

    while(BFS(N))
    {
        for(it = L[N].begin(); it != L[N].end(); it++)
            if(F[*it][N] < C[*it][N] && used[*it])
                {
                    now = *it ;
                    flow = C[*it][N] - F[*it][N];
                    while (now != 1)
                    {
                        if( flow > C[dad[now]][now] - F[dad[now]][now])
                            flow = C[dad[now]][now] - F[dad[now]][now];
                        now = dad [now];
                    }
                    if(flow > 0)
                    {
                        maxFlow = maxFlow + flow;
                        now = *it ;
                        F[*it][N] = F[*it][N] + flow;
                        F[N][*it] = F[N][*it] - flow;
                        while (now != 1)
                        {
                            F[dad[now]][now] = F[dad[now]][now] + flow;
                            F[now][dad[now]] = F[now][dad[now]] - flow;
                            now = dad [now];
                        }

                    }
                }

    }

    printf("%d",maxFlow);
    return 0;
}