Cod sursa(job #2395968)

Utilizator PredaBossPreda Andrei PredaBoss Data 3 aprilie 2019 08:59:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,x,y,val,ans;
int c[1005][1005];
int f[1005][1005];
int father[1005];
vector<int>nod[1005];
int bfs()
{
    for(int i=2;i<=n;i++)
        father[i]=-1;
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int pos=q.front();
        q.pop();
        for(int i=0;i<nod[pos].size();i++)
        {
            if(father[nod[pos][i]]!=-1 || c[pos][nod[pos][i]]==f[pos][nod[pos][i]])
                continue;
            father[nod[pos][i]]=pos;
            q.push(nod[pos][i]);
        }
    }
    if(father[n]==-1)
        return 0;
    int rez=0;
    for(int i=0;i<nod[n].size();i++)
    {
        int flux=c[nod[n][i]][n]-f[nod[n][i]][n];
        int pos=nod[n][i];
        while(father[pos]!=0 && flux>0)
        {
            flux=min(flux,c[father[pos]][pos]-f[father[pos]][pos]);
            pos=father[pos];
        }
        if(flux==0)continue;
        f[nod[n][i]][n]+=flux;
        f[n][nod[n][i]]-=flux;
        pos=nod[n][i];
        while(father[pos]!=0)
        {
            f[father[pos]][pos]+=flux;
            f[pos][father[pos]]-=flux;
            pos=father[pos];
        }
        rez+=flux;
    }
    return rez;
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>val;
        c[x][y]=val;
        nod[x].push_back(y);
        nod[y].push_back(x);
    }
    val=1;
    while(val)
    {
        val=bfs();
        ans+=val;
    }
    fout<<ans;
    return 0;
}