Cod sursa(job #2708472)

Utilizator valeriucaraselCarasel Valeriu valeriucarasel Data 18 februarie 2021 19:37:30
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int N=501;
const int M=1000;

struct muchie
{
    int x,y,c;
};

muchie v[M+M];
vector <int> a[N];
int m,n,pred[N];

int val_flux()
{
    int val=v[pred[n]].c;
    int x=n;
    while (x!=1)
    {
        int i=pred[x];
        val=min(val,v[i].c);
        x=v[i].x+v[i].y-x;
    }
    return val;
}

void init_pred()
{
    for (int i=1;i<=n;i++)
    {
        pred[i]=-1;
    }
}

bool bfs()
{
    bool rez=false;
    init_pred();
    queue<int> q;
    q.push(1);
    while (!q.empty())
    {
        int x=q.front();
        q.pop();
        for (auto i: a[x])
        {
            if (v[i].c>0)
            {
                int y=v[i].x+v[i].y-x;
                if (pred[y]!=-1)
                {
                    continue;
                }
                pred[y]=i;
                q.push(y);
                if (y==n)
                {
                    rez=true;
                }
            }
        }
    }
    return rez;
}

long long flux()
{
    long long f=0;
    while (bfs())
    {
        int fc=val_flux();
        f+=fc;
        int x=n;
        while (x != 1)
        {
            int i=pred[x];
            x=v[i].x+v[i].y-x;
            v[i].c-=fc;
            int j=i+m;
            if (j>=2*m)
            {
                j=i-m;
            }
            v[j].c+=fc;
        }
    }
    return f;
}

int main()
{
    cin>>n>>m;
    for (int i=0;i<m;i++)
    {
        cin>>v[i].x>>v[i].y>>v[i].c;
        v[i+m].x=v[i].y;
        v[i+m].y=v[i].x;
        v[i+m].c=0;
        a[v[i].x].push_back(i);
        a[v[i].y].push_back(i+m);
    }
    cout<<flux();
    return 0;
}