Cod sursa(job #1832906)

Utilizator mateigabriel99Matei Gabriel mateigabriel99 Data 21 decembrie 2016 10:36:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <string.h>

#define NMax 1005

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int N,M;
int Cap[NMax][NMax],flux[NMax][NMax];
int tata[NMax],sol;
vector<int> Graf[NMax];
deque<int> Q;
bool mark[NMax];

void Read();

int 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 EdmondsKarp()
{
    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;
            }
    fout<<sol;
}

int main()
{
    Read();
    EdmondsKarp();
    return 0;
}

void Read()
{
    fin>>N>>M;
    for(int i=1;i<=M;i++)
    {
        int from,to,flux;
        fin>>from>>to>>flux;
        Graf[from].push_back(to);
        Graf[to].push_back(from);
        Cap[from][to]=flux;
    }
}