Cod sursa(job #2675776)

Utilizator etienAndrone Stefan etien Data 22 noiembrie 2020 15:30:50
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 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[100001];
int t[100001];
int cost[1001][1001];
bool bl[1001][1001];
int flow[1001][1001],f,tot;
vector<int>w;
void adauga(int nod)
{
    if(nod==1)
        w.push_back(1);
    else
    {
        adauga(t[nod]);
        w.push_back(nod);
    }
}
int main()
{
    int n,m;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        cost[a][b]=c;
    }
    q.push(1);
    viz[1]=true;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(auto x:v[nod])
            if(!viz[x]&&!bl[nod][x])
            {
                t[x]=nod;
                q.push(x);
                viz[x]=true;
            }
    }
    while(viz[n])
    {
        adauga(n);
        fill(viz,viz+1001,0);
        int cmin=1000001;
        for(int i=0;i+1<w.size();i++)
        {
            int a=w[i];
            int b=w[i+1];
            if(cost[a][b])
                if(cmin>cost[a][b]-flow[a][b])
                    cmin=cost[a][b]-flow[a][b];
            if(cost[b][a])
                if(cmin>flow[b][a])
                    cmin=flow[b][a];
        }
        for(int i=0;i+1<w.size();i++)
        {
            int a=w[i];
            int b=w[i+1];
            if(cost[a][b])
                flow[a][b]+=cmin;
            if(cost[b][a])
                flow[b][a]-=cmin;
            if(cost[a][b]==flow[a][b])
                bl[a][b]=true;
            else bl[a][b]=false;
            if(cost[b][a]==flow[b][a])
                bl[b][a]=true;
            else bl[b][a]=false;
        }
        tot+=cmin;
        q.push(1);
        viz[1]=true;
        while(!q.empty())
        {
            int nod=q.front();
            q.pop();
            for(auto x:v[nod])
                if(!viz[x]&&!bl[nod][x])
                {
                    t[x]=nod;
                    q.push(x);
                    viz[x]=true;
                }
        }
        w.clear();
    }
    fout<<tot;
}