Cod sursa(job #2450309)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 22 august 2019 17:00:43
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <queue>

using namespace std;

const int N=1000+7;
const int inf=(int)1e9;
int n,m;
int e[N][N];
vector <int> g[N];
int flux_total;
int mx[N];
int par[N];
vector <pair <int,int>> ord[N];

int flux()
{
        /// minimul sa fie maxim
        for(int i=1;i<=n;i++)
        {
                ord[i].clear();
                for(auto &j : g[i])
                        ord[i].push_back({e[i][j],j});
                sort(ord[i].rbegin(),ord[i].rend());
        }
        for(int i=2;i<=n;i++)
                mx[i]=-1;
        mx[1]=inf;
        priority_queue <pair <int,int>> pq;
        pq.push({inf,1});
        while (!pq.empty())
        {
                auto it=pq.top();
                int nod=it.second;
                pq.pop();
                if(it.first!=mx[nod])
                        continue;
                for(auto &it : ord[nod])
                {
                        int j=it.second,posi=min(mx[nod],e[nod][j]);
                        if(posi>mx[j])
                        {
                                mx[j]=posi;
                                pq.push({mx[j],j});
                                par[j]=nod;
                        }
                }
        }

        if(mx[n]==-1)
                return 0;

        int now=n;
        while(now!=1)
        {
                int kid=par[now];
                e[kid][now]-=mx[n];
                e[now][kid]+=mx[n];
                now=kid;
        }
        return mx[n];
}

int main()
{
        freopen("maxflow.in","r",stdin);
        freopen("maxflow.out","w",stdout);

        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
                int a,b,c;
                cin>>a>>b>>c;
                g[a].push_back(b);
                g[b].push_back(a);
                e[a][b]+=c;
        }

        while(1)
        {
                int a=flux();
                if(!a)
                        break;
                flux_total+=a;
        }
        cout<<flux_total<<"\n";

        return 0;
}