Cod sursa(job #1383794)

Utilizator Toast97Calin Farcas Toast97 Data 10 martie 2015 17:36:59
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.86 kb
#include <fstream>

using namespace std;

ifstream f ("maxflow.in");
ofstream g ("maxflow.out");

int cap[1005][1005], s, t, F = 0, n, m, flux[1005][1005], q[1005], tata_mare[1005];
bool viz[1005];

struct nod
{
    int info;
    nod *adr;
} *v[1005], *pq, *uq;

void adauga (int x, int y)
{
    nod *c;
    c = new nod;

    c -> info = y;
    c -> adr = v[x];
    v[x] = c;
}

void citire ()
{
    f >> n >> m;

    int x, y, c;

    for (int i = 1; i <= m; i ++)
    {
        f >> x >> y >> c;

        adauga (x, y);
        adauga (y, x);
        cap[x][y] = c;
    }
}

bool bfs ()
{
    for (int i = 1; i <= n; i ++)
        viz[i] = 0;

    int p, u, curent;
    p = u = 1;
    q[u] = s;
    viz[s] = 1;

    nod *c;

    while (p <= u)
    {
        curent = q[p];

        if (curent != t)

        {c = v[curent];

        while (c)
        {
                if (cap[curent][c -> info] > flux[curent][c -> info] && !viz[c -> info])
                    {
                        ++ u;
                        q[u] = c -> info;
                        tata_mare[c -> info] = curent;
                        viz[c -> info] = 1;
                    }

            c = c -> adr;
        }
        }
        ++ p;
    }

    return viz[t];
}

bool mini (int a, int b)
{
    if (a < b)
        return a;
    return b;
}

int main()
{
    citire ();
    s = 1;
    t = n;

    int curent, minim, inapoi;
    nod *c;

    while (bfs ())
    {
        c = v[t];
        while (c)
    {
            curent = c -> info;

            tata_mare[t] = curent;

            minim = (1 << 31) - 1;

            for (inapoi = t; inapoi != 1; inapoi = tata_mare[inapoi])
                minim = mini (minim, cap[tata_mare[inapoi]][inapoi] - flux[tata_mare[inapoi]][inapoi]);

                 for (inapoi = t; inapoi != 1; inapoi = tata_mare[inapoi])
                 {
                     flux[tata_mare[inapoi]][inapoi] += minim;
                     flux[inapoi][tata_mare[inapoi]] -= minim;
                 }

                 F += minim;

            c = c -> adr;
    }
    }

    g << F;

    f.close ();
    g.close ();
    return 0;
}

/*#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;



}*/