Cod sursa(job #1602839)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 16 februarie 2016 22:36:05
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int MAX_INF=0x3f3f3f3f;
vector<int>H[1001],P;
vector<int>::iterator it;
queue<int>Q;
bitset<1001>viz;
int C[1001][1001],F[1001][1001],n,tata[1001];
bool Bfs()
{
    Q.push(1);
    viz[1]=1;
    while(Q.size())
    {
        int a=Q.front();Q.pop();
        for(it=H[a].begin();it!=H[a].end();it++)
        {
            if(C[a][*it]!=F[a][*it]&&viz[*it]==0)
            {
            viz[*it]=1;
            tata[*it]=a;
            Q.push(*it);
            }

        }
    }
    return viz[n];
}
int main()
{
    int m,i,a,b,z,flux=0,fmin;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>z;
        C[a][b]+=z;
        H[a].push_back(b);
        H[b].push_back(a);
    }
    while(Bfs())
    {
        for(it=H[n].begin();it!=H[n].end();it++)
        {
            if(C[*it][n]!=F[*it][n]&&viz[*it]!=0)
            {
                fmin=MAX_INF;
                tata[n]=*it;
                for(i=n;i!=1;i=tata[i])
                {
                    fmin=min(fmin,C[tata[i]][i]-F[tata[i]][i]);
                }
                if(fmin!=0)
                {
                    flux+=fmin;
                    for(i=n;i!=1;i=tata[i])
                    {
                        F[tata[i]][i]+=fmin;
                        F[i][tata[i]]-=fmin;
                    }
                }
            }
        }
        viz.reset();
    }
    fout<<flux;
}