Cod sursa(job #2752524)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 18 mai 2021 11:45:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef long long ll;
typedef pair<int,int> pi;
const int dim=1000+10;
int t,T;
int minim;
vector < int > viz(dim,0);
vector < int > V[dim];

bool BFS(int n,int sursa,int dest,vector < vector <int> >& C,vector < int >& T)
{
    queue < int > qu;
    qu.push(sursa);
    viz[sursa]=1;
    T[sursa]=-1;
    while(!qu.empty())
    {
        int nod=qu.front();
        qu.pop();
        viz[nod]=2;

        if(viz[dest])
            break;

        for(int j:V[nod])
            if(!viz[j] && C[nod][j])
            {
                viz[j]=1;
                T[j]=nod;
                qu.push((j));
            }
    }
    if(viz[dest])
        return true;
    return false;
}

void init(int n,vector < int >& T)
{
    for(int i=0;i<=n;i++)
        T[i]=-1,viz[i]=0;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n,m,sursa,dest;
    f>>n>>m;

    vector < vector < int > > C(n+1,vector<int>(n+1,0)),F(n+1,vector<int>(n+1,0));
    vector < vector < bool > > is(n+1,vector<bool>(n+1,0));
    vector < int > T(n+1,-1);
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        f>>a>>b>>c;
        V[a].pb(b);
        V[b].pb(a);
        is[a][b]=1;
        C[a][b]=c;
    }

    sursa=1;
    dest=n;
    while(BFS(n,sursa,dest,C,T)){

        for(int j:V[dest])
            if(viz[j] && C[j][dest])
            {
                T[dest]=j;
                int minim=INT_MAX;
                int tata=dest;
                while(tata!=sursa)
                {
                    minim=min(minim,C[T[tata]][tata]);
                    tata=T[tata];
                }

                tata=dest;
                while(tata!=sursa) //contruiesc graful rezidual din cel initial pentru urmatoarea iteratie
                    //actualizez si fluxul pe muchiile pe care merg
                {
                    C[T[tata]][tata]-=minim;
                    C[tata][T[tata]]+=minim;

                    if(is[T[tata]][tata]==1) //exista muchia pe graful initial
                        //am graful initial cu fluzurile si adun fluxul nou obtinut
                    {
                        F[T[tata]][tata]+=minim;
                        F[tata][T[tata]]-=minim;
                    }
                    else
                    {
                        F[T[tata]][tata]-=minim;
                        F[tata][T[tata]]+=minim;
                    }
                    tata=T[tata];
                }
            }
        init(n,T);
    }

    int ans=0;

    for(int nod:V[sursa])
        ans+=F[sursa][nod];
    g<<ans;

    return 0;
}