Cod sursa(job #1383299)

Utilizator PetrutiuPaulPetrutiu Paul Gabriel PetrutiuPaul Data 10 martie 2015 08:52:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

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

vector<int>v[1006];
queue <int>q;
bool used[1006];
int ant[1006];
int n,m;

int C[1006][1006],F[1006][1006];

int BFS()
{
    int nod;

    for(int i=1;i<=n;++i) used[i] = false;

    used[1]=true;

    q.push(1);

    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(nod!=n)
            for(int i=0;i<v[nod].size();i++)
            {
                if(used[v[nod][i]]==false && F[nod][v[nod][i]]<C[nod][v[nod][i]])
                {
                    used[v[nod][i]]=true;
                    ant[v[nod][i]]=nod;
                    q.push(v[nod][i]);
                }
            }
    }
    return used[n];
}


int main()
{
    int x,y,c;

    fin>>n>>m;

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=c;
    }

    int flow=0,flowmin,nod;

    while (BFS())
        for(int i=0;i<v[n].size();i++)
        {
            flowmin=1<<29;
            ant[n]=v[n][i];

            nod=n;

            while (nod!=1)
            {
                flowmin=min(flowmin, C[ant[nod]][nod]-F[ant[nod]][nod]);
                nod=ant[nod];
            }

            nod=n;

            while (nod!=1)
            {
                F[ant[nod]][nod]+=flowmin;
                F[nod][ant[nod]]-=flowmin;
                nod=ant[nod];
            }

            flow+=flowmin;

        }
    fout<<flow;



}