Cod sursa(job #2940135)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 14 noiembrie 2022 21:20:37
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include<vector>
#include <algorithm>
#import <cmath>
#import <cassert>
#import <queue>
using namespace std;
vector<vector<int>>cost,f,g;
vector<int>t;
int n;
bool bf()
{
    vector<bool>ok(n+1,1);
    queue<int>q;
    q.push(1);
    ok[1]=0;
    while(q.size())
    {
        int nod=q.front();
        q.pop();
        for(auto &c:g[nod])
        {
            if(!ok[c] || f[nod][c]==cost[nod][c])continue;
            t[c]=nod;
            q.push(c);
            ok[c]=0;
            if(c==n)return 1;
        }
    }
    return 0;
}
int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("	maxflow.out");
    int m;
    cin>>n>>m;
    cost=f=vector<vector<int>>(n+1,vector<int>(n+1,0));
    g.resize(n+1);
    t.resize(n+1);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        cost[x][y]=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int rez=0;
    while(bf())
    {
        int val=2e9;
        for(int i=n;i!=1;i=t[i])
        {
            val=min(val,cost[t[i]][i]-f[t[i]][i]);
        }
        for(int i=n;i!=1;i=t[i])
        {
            f[t[i]][i]+=val;
            f[i][t[i]]-=val;
        }
        rez+=val;
    }
    cout<<rez;
}