Cod sursa(job #1871456)

Utilizator Coroian_DavidCoroian David Coroian_David Data 7 februarie 2017 13:35:41
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <cstdio>

#include <cstring>

#define sqrInf 999999999

using namespace std;

FILE *fi, *g;

int n, m;

int rez;

///Graf
int c[1001][1001];
int f[1001][1001];

int k;

int lst[1001];

int urm[10001];
int nod[10001];

bool viz[1001];

int que[1001];

int tata[1001];

void add(int a, int b)
{
    k ++;

    nod[k] = b;
    urm[k] = lst[a];

    lst[a] = k;
}

void readFile()
{
    fi = fopen("maxflow.in", "r");

    fscanf(fi, "%d%d", &n, &m);

    int i;
    int a, b;
    int cs;
    for(i = 1; i <= m; i ++)
    {
        fscanf(fi, "%d%d%d", &a, &b, &cs);

        c[a][b] += cs;

        add(a, b);
        add(b, a);
    }

    fclose(fi);
}

int BFS()
{
    memset(viz, 0, sizeof(viz));

    viz[1] = 1;

    int st = 1, dr = 0;
    int cr, p;

    que[++ dr] = 1;

    while(st <= dr)
    {
        cr = que[st ++];

        for(p = lst[cr]; p != 0; p = urm[p])
        {
            if(viz[nod[p]] == 0 && f[cr][nod[p]] < c[cr][nod[p]])
            {
                viz[nod[p]] = 1;

                que[++ dr] = nod[p];

                tata[nod[p]] = cr;
            }
        }
    }

    return viz[n];
}

inline int mna(int a, int b)
{
    return (a < b ? a : b);
}

void solve()
{
    int i, j;
    int p;
    int nodul;
    int mn;

    while(BFS() != 0)
    {
        for(p = lst[n]; p != 0; p = urm[p])
        {
            nodul = nod[p];

            if(f[nodul][n] < c[nodul][n] && viz[nodul] == 1)
            {
                tata[n] = nodul;

                mn = sqrInf;

               // printf("%d\n", mn);

                for(nodul = n; nodul != 1; nodul = tata[nodul])
                {
                    mn = mna(mn, c[tata[nodul]][nodul] - f[tata[nodul]][nodul]);

                    //if(c[tata[nodul]][nodul] - f[tata[nodul]][nodul] == 0)
                   //     printf("++%d %d\n", nodul, tata[nodul]);
                }

              //  if(mn != 0)
                //    printf("%d\n", mn);

                if(mn > 0)
                {
                    for(nodul = n; nodul != 1; nodul = tata[nodul])
                    {
                        f[tata[nodul]][nodul] += mn;
                        f[nodul][tata[nodul]] -= mn;
                    }
                }

                rez += mn;
            }
        }
    }
}

void printFile()
{
    g = fopen("maxflow.out", "w");

    fprintf(g, "%d\n", rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}