Cod sursa(job #2874223)

Utilizator mcip1977Muresan Ciprian mcip1977 Data 19 martie 2022 13:21:50
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

struct arc{ int j,c; };
int n,m,P[1001],T[1001],C[1001][1001],F[1001][1001],fluxmax;
vector<int> G[1001];

int BF()
{
    queue<int> Q;
    for(int i=1;i<=n;i++) P[i]=0;
    P[1]=1;
    Q.push(1);
    while(!Q.empty())
    {
        int i=Q.front();
        Q.pop();
        if(i!=n)
        {
            for(auto j:G[i])
                if(!P[j] && C[i][j]!=F[i][j])
                {
                    P[j]=1;
                    Q.push(j);
                    T[j]=i;
                }
        }
        else return 1;
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=c;
    }
    while(BF())
        for(auto i:G[n])
            if(C[i][n]!=F[i][n] && P[i])
            {
                T[n]=i;
                int fmin=110000;
                for(int i=n;i!=1;i=T[i])
                    fmin=min(fmin,C[T[i]][i]-F[T[i]][i]);
                if(fmin>0)
                    for(int i=n;i!=1;i=T[i])
                    {
                        F[T[i]][i]+=fmin;
                        F[i][T[i]]-=fmin;
                    }
                fluxmax+=fmin;
            }
    fout<<fluxmax;
    return 0;
}