Cod sursa(job #1202108)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 26 iunie 2014 21:26:01
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <iostream>
#include <queue>
#include <bitset>

using namespace std;

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

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

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

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

    bool maxflowbfs()
    {
        maxflowviz&=0;

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

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

            coada.pop();

            for(int maxflowi=1;i<=n;i++)
                if(cap[maxflowy][maxflowi])
                    if(!viz[maxflowi]){
                        viz[maxflowi]=1;
                        tata[maxflowi]=y;
                        coada.push(maxflowi);
                    }
        }

        return maxflowviz[maxflowt];
    }

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

        int maxflowflux=0;
        while(maxflowbfs()){
            for(int maxflowi=1;i<=n;i++)
                if(viz[i] && cap[i][t]){
                    int maxflowminim=cap[i][t];
                    int maxflownod=maxflowi;

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

                    maxflowflux+=maxflowminim;
                    maxflowcap[i][t]-=maxflowminim;
                    maxflowcap[t][i]+=maxflowminim;

                    maxflownod=i;
                    while(maxflowtata[maxflownod]){
                        maxflowcap[maxflowtata[maxflownod]][maxflownod]-=maxflowminim;
                        maxflowcap[maxflownod][tata[maxflownod]]+=maxflowminim;
                        maxflownod=maxflowtata[maxflownod];
                    }
                }
        }
    }
}
//End of Dinic's Maxflow Algorithm

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

    int m;
    cin>>maxflown>>m;

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

    s=1,t=n;
    cout<<maxflow()<<'\n';

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