Cod sursa(job #2204964)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 17 mai 2018 13:12:56
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
#define MAXN 1001
using namespace std;
int c[MAXN][MAXN],f[MAXN][MAXN];
vector<vector<int> > la;
vector<bool> viz;
vector<int> tata;
int n,m,Minim;
queue<int> coada;
int cost(int x,int y)
{
    if(!x) return 0;
    return c[x][y]-f[x][y];
}
void AfiseazaLant(const vector<int>& tata,int nod)
{
    if(nod!=0)
    {
        AfiseazaLant(tata,tata[nod]);
        cout<<nod<<' ';
    }
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin>>n>>m;
    la.resize(n+1);
    for(int i=0; i<m; ++i)
    {
        int x,y;
        fin>>x>>y;
        fin>>c[x][y];
        la[x].push_back(y);
        la[y].push_back(x);
    }
    Minim=1;
    while(Minim)
    {
        viz.resize(n+1,0);
        tata.resize(n+1,0);
        coada.push(1);
        viz[1]=true;
        while(!coada.empty() && !viz[n])
        {
            int nod=coada.front();
            coada.pop();
            for(int i=0; i<la[nod].size(); ++i)
                if(!viz[la[nod][i]] && cost(nod,la[nod][i]))
                {
                    tata[la[nod][i]]=nod;
                    viz[la[nod][i]]=true;
                    coada.push(la[nod][i]);
                    if(la[nod][i]==n) break;
                }
        }
        Minim=cost(tata[n],n);
        ///AfiseazaLant(tata,n);
        //cout<<endl;
        int aux=tata[n];
        while(tata[aux]!=0)
        {
            Minim=min(Minim,cost(tata[aux],aux));
            aux=tata[aux];
        }
        aux=n;
        while(tata[aux]!=0)
        {
            f[tata[aux]][aux]+=Minim;
            f[aux][tata[aux]]-=Minim;
            aux=tata[aux];
        }
        viz.clear();
        tata.clear();
        while(!coada.empty()) coada.pop();
    };
    int flux=0;
    for(int i=1; i<=n; ++i)
        flux+=f[1][i];
    /*for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=n; ++j)
            cout<<f[i][j]<<' ';
        cout<<endl;
    }*/
    fout<<flux<<'\n';
    return 0;
}