Cod sursa(job #1557670)

Utilizator Liviu98Dinca Liviu Liviu98 Data 27 decembrie 2015 23:05:35
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
//Flux maxim intr-o retea de transport
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#include <cstring>
#define NMax 1001
using namespace std;
vector<int> Graf[NMax];
int N,M,Cap[NMax][NMax],flux[NMax][NMax];
int tata[NMax],sol,x,y,z;
deque<int> Q;
bool mark[NMax];

void Read()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        Graf[x].push_back(y);
        Graf[y].push_back(x);
        Cap[x][y]=z;
    }
}

int BFS()//Construiesc arborele BFS
{
    memset(tata,0,sizeof(tata));
    memset(mark,false,sizeof(mark));
    Q.push_back(1);
    while(Q.empty()==false)
    {
        int nod=Q.front();
        Q.pop_front();
        for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
        {
            int vecin=*it;
            if(Cap[nod][vecin]>flux[nod][vecin] && mark[vecin]==false)
            {
                mark[vecin]=true;
                Q.push_back(vecin);
                tata[vecin]=nod;
            }
        }
    }
    return mark[N];
}

void Edmonds_Karp()
{
    while(BFS())
    {
        for(int i=1;i<=N;i++)
        {
            if(Cap[i][N]>flux[i][N] && tata[i])
            {
                int fmin=Cap[i][N]-flux[i][N];

                for(int j=i;j!=1;j=tata[j])
                    fmin=min(fmin,(Cap[tata[j]][j]-flux[tata[j]][j]));

                for(int j=i;j!=1;j=tata[j])
                {
                    flux[tata[j]][j]=flux[tata[j]][j]+fmin;
                    flux[j][tata[j]]=flux[j][tata[j]]-fmin;
                }
                flux[i][N]+=fmin;
                flux[N][i]-=fmin;
                sol=sol+fmin;
            }
        }
    }
    printf("%d",sol);
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    Read();
    Edmonds_Karp();
}