Cod sursa(job #2187568)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 26 martie 2018 16:52:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int m,n,f,rasp,flux[1005][1005],capacitate[1005][1005],viz[1005],vTati[1005];
vector <int> G[1005];
queue <int> qbfs;
void citire()
{
    scanf("%d%d",&n,&m);
    int nod1,nod2,c;
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&nod1,&nod2,&c);
        G[nod1].push_back(nod2);
        G[nod2].push_back(nod1);
        capacitate[nod1][nod2]=c;
    }
}
int bfs()
{
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    qbfs.push(1);
    int nod;
    while(!qbfs.empty())
    {
        nod=qbfs.front();
        qbfs.pop();
        if(nod==n)
            continue;
        for(auto fiu:G[nod])
        {
            if(capacitate[nod][fiu]>flux[nod][fiu]&&!viz[fiu])
            {
                vTati[fiu]=nod;
                viz[fiu]=1;
                qbfs.push(fiu);
            }
        }
    }
    return viz[n];
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    citire();
    while(bfs())
    {
        for(auto frunza:G[n])
        {
            if(viz[frunza]&&capacitate[frunza][n]>flux[frunza][n])
            {
                vTati[n]=frunza;
                f=0x3f3f3f3f;
                for(int nod=n; nod!=1; nod=vTati[nod])
                {
                    f=min(f,capacitate[vTati[nod]][nod]-flux[vTati[nod]][nod]);
                }
                for(int nod=n; nod!=1; nod=vTati[nod])
                {
                    flux[nod][vTati[nod]]-=f;
                    flux[vTati[nod]][nod]+=f;
                }
                rasp+=f;
            }
        }
    }
    printf("%d",rasp);
    return 0;
}