Cod sursa(job #1202121)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 26 iunie 2014 21:58:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <fstream>
#include <deque>
#include <bitset>

using namespace std;

//Dinic's Maxflow Algorithm
//Don't forget about
//#include <deque>
//#include <bitset>

//Problem specific parameters
#define MAXFLOWNMAX 1005
int maxflown,maxflows,maxflowt;

//Actual implementation
int maxflowcap[MAXFLOWNMAX][MAXFLOWNMAX];
int maxflowtata[MAXFLOWNMAX];

bitset<MAXFLOWNMAX> maxflowviz;
deque<int> maxflowcoada;

bool maxflowbfs()
{
    maxflowviz&=0;

    maxflowviz[maxflows]=1;
    maxflowtata[maxflows]=0;
    maxflowcoada.push_back(maxflows);

    while(!maxflowcoada.empty()){
        int maxflowy=maxflowcoada.front();

        maxflowcoada.pop_back();

        for(int maxflowi=1;maxflowi<=maxflown;maxflowi++)
            if(maxflowcap[maxflowy][maxflowi])
                if(!maxflowviz[maxflowi]){
                    maxflowviz[maxflowi]=1;
                    maxflowtata[maxflowi]=maxflowy;
                    maxflowcoada.push_back(maxflowi);
                }
    }

    return maxflowviz[maxflowt];
}

inline int maxflow()
{
    if(!maxflown) //For stability issues
        return 0;

    int maxflowflux=0;
    while(maxflowbfs()){
        for(int maxflowi=1;maxflowi<=maxflown;maxflowi++)
            if(maxflowviz[maxflowi] && maxflowcap[maxflowi][maxflowt]){
                int maxflowminim=maxflowcap[maxflowi][maxflowt];
                int maxflownod=maxflowi;

                while(maxflowtata[maxflownod]){
                    maxflowminim=min(maxflowminim,maxflowcap[maxflowtata[maxflownod]][maxflownod]);
                    maxflownod=maxflowtata[maxflownod];
                }

                maxflowflux+=maxflowminim;
                maxflowcap[maxflowi][maxflowt]-=maxflowminim;
                maxflowcap[maxflowt][maxflowi]+=maxflowminim;

                maxflownod=maxflowi;
                while(maxflowtata[maxflownod]){
                    maxflowcap[maxflowtata[maxflownod]][maxflownod]-=maxflowminim;
                    maxflowcap[maxflownod][maxflowtata[maxflownod]]+=maxflowminim;
                    maxflownod=maxflowtata[maxflownod];
                }
            }
    }

    return maxflowflux;
}
//End of Dinic's Maxflow Algorithm

//Test Code
int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");

    int m=0;
    cin>>maxflown>>m;

    int a,b,c;
    while(m--){
        cin>>a>>b>>c;
        maxflowcap[a][b]=c;
    }

    maxflows=1,maxflowt=maxflown;
    cout<<maxflow()<<'\n';

    cin.close();
    cout.close();
    return 0;
}