Cod sursa(job #3224820)

Utilizator rarest@yahoo.comtorcea rares [email protected] Data 16 aprilie 2024 12:01:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define MAX 1005

using namespace std;

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

vector<int>vec[MAX];
int cap[MAX][MAX];
int flux[MAX][MAX];
bool viz[MAX];
int parc[MAX];
int tata[MAX];
int n,m;

bool bfs()
{
    int i;
    for(i=1;i<=n;++i)
        viz[i]=0;
    viz[1]=1;
    parc[0]=1;
    parc[1]=1;
    for(i=1;i<=parc[0];++i)
    {
        int crt=parc[i];
        int j;
        int sz=vec[crt].size();
        for(j=0;j<sz;++j)
            if(!viz[vec[crt][j]] && flux[crt][vec[crt][j]]<cap[crt][vec[crt][j]])
            {
                viz[vec[crt][j]]=1;
                parc[++parc[0]]=vec[crt][j];
                tata[vec[crt][j]]=crt;
                if(vec[crt][j]==n)
                    return 1;
            }
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    while(m--)
    {
        int x,y,z;
        fin>>x>>y>>z;
        cap[x][y]+=z;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    int rasp=0;
    while(bfs())
    {
        int nod=n;
        int minn=1e9;
        while(nod>1)
        {
            minn=min(minn,cap[tata[nod]][nod]-flux[tata[nod]][nod]);
            nod=tata[nod];
        }

        nod=n;
        while(nod>1)
        {
            flux[tata[nod]][nod]+=minn;
            flux[nod][tata[nod]]-=minn;
            nod=tata[nod];
        }
        rasp+=minn;
    }
    fout<<rasp;
    return 0;
}