Cod sursa(job #2293222)

Utilizator PredaBossPreda Andrei PredaBoss Data 30 noiembrie 2018 17:41:46
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,x,y,c,ans;
int cap[1005][1005],last[1005],flo[1005][1005];
bool bfs()
{
    queue<int>q;
    q.push(1);
    memset(last,-1,sizeof last);
    last[1]=0;
    while(!q.empty())
    {
        int pos=q.front();
        q.pop();
        for(int i=1;i<=n;i++)
        {
            if(last[i]!=-1 || cap[pos][i]<=flo[pos][i])
                continue;
            last[i]=pos;
            q.push(i);
        }
    }
    return last[n]!=-1;
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        cap[x][y]=c;
    }
    while(bfs())
    {
        for(int i=1;i<=n;i++)
        {
            if(cap[i][n]<=flo[i][n])
                continue;
            c=cap[i][n]-flo[i][n];
            int pos=i;
            while(last[pos]!=0)
            {
                c=min(c,cap[last[pos]][pos]-flo[last[pos]][pos]);
                pos=last[pos];
            }
            pos=i;
            ans+=c;
            flo[pos][n]+=c;
            flo[n][pos]-=c;
            while(last[pos]!=0)
            {
                flo[last[pos]][pos]+=c;
                flo[pos][last[pos]]-=c;
                pos=last[pos];
            }
        }
    }
    fout<<ans;
    return 0;
}