Cod sursa(job #1941714)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 27 martie 2017 15:52:13
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <queue>
#include <fstream>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
const int Dim=1001;
const int Inf=0x3f3f3f3f;
int a[Dim][Dim],t[Dim],viz[Dim],n,m,flux_final;
queue <int> Q;
void ReadGraph()
{
    int x,y,c;
    fi>>n>>m;
    for (int i=1; i<=m; i++)
    {
        fi>>x>>y>>c;
        a[x][y]=c;
    }
}

void Bfs(int x)
{

    for( Q.push(x); !Q.empty(); Q.pop())
    {
        x=Q.front();
        for(int i=1; i<=n; i++)
        {
            if(a[x][i]<=0) continue;
            if(viz[i]==1) continue;
            Q.push(i);
            viz[i]=1;
            t[i]=x;
        }
    }
}


int  FluxMinim()
{
    while (true)
    {
        for(int i=1; i<=n; ++i) viz[i]=false;
        Bfs(1);
        if (viz[n]==false)break;
        for(int j=1; j<=n; j++)
            if (a[j][n] > 0)
            {
                int fmax=a[j][n];

                for (int i=j; i!=1; i=t[i])
                      fmax=min(fmax,a[t[i]][i]);
                a[j][n]-= fmax;
                a[n][j]+= fmax;
                for (int i=j; i!=1; i=t[i])
                {
                    a[t[i]][i]-=fmax;
                    a[i][t[i]]+=fmax;
                }
                flux_final+=fmax;
            }
    }
    fo<<flux_final<<'\n';


}
int main()
{
    ReadGraph();
    FluxMinim();



    return 0;
}