Cod sursa(job #2897179)

Utilizator betybety bety bety Data 2 mai 2022 20:09:04
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int lim=1005;
struct edge
{
    int nod;
    int cap;
    int rev;
};
pair<int,int> pred[lim];
vector<edge> vec[lim];
queue<int> q;
int n,m,x,y,z;
int main()
{
    ios_base::sync_with_stdio(false);
    in.tie(0),out.tie(0);
    in>>n>>m;
    for(int i=1;i<=m;++i)
    {
        in>>x>>y>>z;
        int a=vec[x].size();
        int b=vec[y].size();
        vec[x].push_back({y,z,b});
        vec[y].push_back({x,0,a});
    }
    int flow=0;
    do
    {
        pred[1]={0,-1};
        for(int i=2;i<=n;++i)
            pred[i]={-1,-1};
        q.push(1);
        while(!q.empty())
        {
            int nod=q.front(); q.pop();
            for(int i=0;i<vec[nod].size();++i)
            if(pred[vec[nod][i].nod].first==-1 and vec[nod][i].cap>0)
                pred[vec[nod][i].nod]={nod,i},q.push(vec[nod][i].nod);
        }
        if(pred[n].first!=-1)
        for(int i=0;i<vec[n].size();++i)
        if(vec[vec[n][i].nod][vec[n][i].rev].cap>0)
        {
            int ind=vec[n][i].rev;
            int last=vec[n][i].nod;
            int minim=vec[last][ind].cap;
            for(int u=last;pred[u].first>0;u=pred[u].first)
                minim=min(minim,vec[pred[u].first][pred[u].second].cap);
            if(minim==0)
                continue;
            flow+=minim;
            vec[last][ind].cap-=minim;
            vec[n][i].cap+=minim;
            for(int u=last;pred[u].first>0;u=pred[u].first)
                vec[pred[u].first][pred[u].second].cap-=minim,
                vec[u][vec[pred[u].first][pred[u].second].rev].cap+=minim;
        }
    }while(pred[n].first!=-1);
    out<<flow<<'\n';
    return 0;
}