Cod sursa(job #2693823)

Utilizator TudorCretuCretu Tudor Andrei TudorCretu Data 7 ianuarie 2021 10:53:46
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <vector>
#include <queue>
#include <fstream>
#include <cstring>
#define nmx 1005
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,x,y,c,r[nmx][nmx],t[nmx],ap,sol,p[nmx][nmx];
vector <int> v[nmx];
int bf()
{
    int nod,i,vc;
    queue <int> q;
    memset(t,0,sizeof(t));
    t[1]=-1;
    q.push(1);
    while(!q.empty())
    {
        nod=q.front();
        if(nod==n) return 1;
        q.pop();
        for(i=0;i<v[nod].size();i++)
        {
            vc=v[nod][i];
            if(!t[vc] && p[nod][vc]!=r[nod][vc])
            {
                t[vc]=nod;
                q.push(vc);
            }
        }
    }
    return 0;
}
void algoritm_fortza()
{
    int i,j,vc;
    while(bf())
    {
        for(i=0;i<v[n].size();i++)
        {
            vc=v[n][i];
            if(t[vc] && p[vc][n]!=r[vc][n])
            {
                ap=p[vc][n]-r[vc][n];
                for(j=vc;j>1;j=t[j])
                    ap=min(ap,p[t[j]][j]-r[t[j]][j]);
                if(ap)
                {
                    r[vc][n]+=ap;
                    r[n][vc]-=ap;
                    for(j=vc;j>1;j=t[j])
                    {
                        r[t[j]][j]+=ap;
                        r[j][t[j]]-=ap;
                    }
                    sol+=ap;
                }
            }
        }
    }
}
int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);
        p[x][y]=c;
    }
    algoritm_fortza();
    g<<sol;
    return 0;
}