Cod sursa(job #2525167)

Utilizator Rares31100Popa Rares Rares31100 Data 16 ianuarie 2020 20:47:29
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>
#define Inf 1000000001

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int n,m,sum;
vector <int> gf[1001];
int cap[1001][1001],flux[1001][1001];
bitset <1001> viz;
queue <int> c;

struct muchie
{
    int nod1,nod2;
    bool tip;
};
muchie tree[1001],start[1001],drum[1001];
int t;

bool bfs()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;

    t=0;
    viz[1]=1;
    c.push(1);

    while(!c.empty())
    {
        int nod=c.front();
        c.pop();

        if(cap[nod][n]-flux[nod][n]>0)
        {
            start[++t]={nod,n,0};
            viz[n]=1;
            continue;
        }
        else if(flux[n][nod]>0)
        {
            start[++t]={nod,n,1};
            viz[n]=1;
            continue;
        }

        for(auto vec:gf[nod])
            if(!viz[vec])
            {
                if(cap[nod][vec]-flux[nod][vec]>0)
                {
                    tree[vec]={nod,vec,0};
                    viz[vec]=1;
                    c.push(vec);
                }
                else if(flux[vec][nod]>0)
                {
                    tree[vec]={nod,vec,1};
                    viz[vec]=1;
                    c.push(vec);
                }
            }
    }

    for(int i=1;i<=t;i++)
    {
        int nr=0;

        drum[++nr]=start[i];
        while(tree[ drum[nr].nod1 ].nod1)
            drum[++nr]=tree[ drum[nr-1].nod1 ];

        int minim=Inf;

        for(int j=1;j<=nr;j++)
            if(drum[j].tip==0)
                minim=min(minim,cap[ drum[j].nod1 ][ drum[j].nod2 ]-flux[ drum[j].nod1 ][ drum[j].nod2 ]);
            else
                minim=min(minim,flux[ drum[j].nod2 ][ drum[j].nod1 ]);

        for(int j=1;j<=nr;j++)
            if(drum[j].tip==0)
                flux[ drum[j].nod1 ][ drum[j].nod2 ]+=minim;
            else
                flux[ drum[j].nod2 ][ drum[j].nod1 ]-=minim;

        sum+=minim;
    }

    return viz[n];
}

int main()
{
    in>>n>>m;

    for(int i,j,ct,k=1;k<=m;k++)
    {
        in>>i>>j>>ct;

        cap[i][j]=ct;
        gf[i].push_back(j);
        gf[j].push_back(i);
    }

    while(bfs());

    out<<sum;

    return 0;
}