Cod sursa(job #2675883)

Utilizator etienAndrone Stefan etien Data 22 noiembrie 2020 19:04:38
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int>v[100001];
queue<int>q;
bool viz[1001];
int t[1001];
bool bl[1001][1001];
int flow[1001][1001],nr,tot;
int w[1001];
void adauga(int nod)
{
    if(nod==1)
        w[++nr]=1;
    else
    {
        adauga(t[nod]);
        w[++nr]=nod;
    }
}
void bfs()
{
    q.push(1);
    viz[1]=true;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(auto x:v[nod])
            if(!viz[x]&&flow[nod][x])
            {
                t[x]=nod;
                q.push(x);
                viz[x]=true;
            }
    }
}
int main()
{
    int n,m;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        flow[a][b]=c;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    bfs();
    while(viz[n])
    {
        for(auto q:v[n])
        {
            adauga(q);
            w[++nr]=n;
            fill(viz,viz+1001,0);
            int cmin=1000001;
            for(int i=1;i+1<=nr;i++)
            {
                int a=w[i];
                int b=w[i+1];
                if(cmin>flow[a][b])
                    cmin=flow[a][b];
            }
            for(int i=1;i+1<=nr;i++)
            {
                int a=w[i];
                int b=w[i+1];
                flow[a][b]-=cmin;
                flow[b][a]+=cmin;
            }
            tot+=cmin;
            nr=0;
        }
        bfs();
    }
    fout<<tot;
}