Cod sursa(job #1150772)

Utilizator ionutz_cnnbIonutz cnnb ionutz_cnnb Data 23 martie 2014 15:14:28
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
// O(n*m*m)
#include <fstream>
#include <vector>
#include <cstring>
#define Mx 1024
using namespace std;
vector<int> Ad[Mx];
int cap[Mx][Mx], fl[Mx][Mx];
int tat[Mx], viz[Mx];
int n;
int BF()
{
    int q[Mx],lq,v1,v2,i,j;
    memset(viz,0,sizeof viz);
    lq=1; q[lq]=1; viz[1]=1;
    for (i=1;i<=lq;i++)
    {
        v1=q[i];
        if (v1!=n)
        {
            for (j=0;j<(int)Ad[v1].size();j++)
            {
                v2=Ad[v1][j];
                if (!viz[v2] && cap[v2]!=fl[v2])
                {
                    q[++lq]=v2; viz[v2]=1; tat[v2]=v1;
                }
            }
        }
    }
    return viz[n];
}
int main()
{
    ifstream fi("maxflow.in"); ofstream fo("maxflow.out");
    int i,j,k,m,f=0,fmin,v;
    fi>>n>>m;
    for (k=0;k<m;k++)
    {
        fi>>i>>j>>v;
        Ad[i].push_back(j);
        Ad[j].push_back(i);
        cap[i][j]=v;
    }
    while (BF()>0)
        for (i=0;i<(int)Ad[n].size();i++)
        {
            v=Ad[n][i];
            if (fl[v][n] == cap[v][n] || !viz[v]) continue;
            tat[n] = v;
            fmin = 999999999;
            for (v = n; v != 1; v = tat[v])
                fmin = min(fmin, cap[ tat[v]][v] - fl[ tat[v]][v]);
            if (fmin > 0)
                for (v = n; v != 1; v = tat[v])
                {
                    fl[ tat[v]][v] += fmin;
                    fl[v][tat[v]] -= fmin;
                }
            f += fmin;
        }
    fo << f << "\n";
    return 0;
}