Cod sursa(job #2485908)

Utilizator eduardmirceabraguta eduard eduardmircea Data 2 noiembrie 2019 10:36:26
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;
ifstream in ("maxflow.in");
ofstream out ("maxflow.out");
int flux,n,i,j,x,y,cost,dad,node,t[1005],s,st,f[1001][1001],c[1001][1001],m,cap;
vector<int>g[5005];
bool bfs (int st,int d)
{
    for(int i=1; i<=n; i++)t[i]=-1;
    t[s]=0;
    queue<int>q;
    q.push(st);
    while(!q.empty())
    {
        int node=q.front();
        q.pop();
        for(auto it:g[node])
        {
            if(t[it]==-1&&c[node][it]>f[node][it])
            {
                t[it]=node;
                if(it==d)return 1;

            q.push(it);
            }
        }

    }
    return 0;
}


int maxflow(int st,int d)
{

    while(bfs(st,d))
    {
        for(auto it:g[d])
        {
            if(t[it]!=-1)
            {
                int add=c[it][d]-f[it][d];
                int node=it,dad=0;
            while(node!=st)
            {
                dad=t[node];
                add=min(add,c[dad][node]-f[dad][node]);
                node=dad;
            }
            f[it][d]+=add;
            f[d][it]-=add;
            flux+=add;
            node=it;
            while(node!=st)
            {
                dad=t[node];
                f[dad][node]+=add;
                f[node][dad]-=add;
                node=dad;
            }
            }


        }
    }
    return flux;
}

int main()
{

    in>>n>>m;
    for(i=1; i<=m; i++)
    {
        in>>x>>y>>cap;
        c[x][y]=cap;
        f[x][y]=0;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    out<<maxflow(1,n);



    return 0;
}