Cod sursa(job #2668768)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 5 noiembrie 2020 12:24:28
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = (1<<29);
struct Muchie{
    int a,b;
    int capacitate;
    int flux;
};
int n,m;
vector <Muchie> muchii;
vector <vector <int> > v;
vector <int> tata;
bool bfs(){
    queue<int> q;
    q.push(1);
    tata.assign(n+1,-1);
    tata[1]=m;
    while(!q.empty()){
        int node=q.front();
        q.pop();
        if(node==n) continue;
        for(int i:v[node]){
            Muchie edge=muchii[i];
            if(tata[edge.b]!=-1 or edge.capacitate==edge.flux)
                continue;
            tata[edge.b]=i;
            q.push(edge.b);
        }
    }
    return tata[n]!=-1;
}
int main()
{
    fin >> n >> m;
    muchii.resize(2*m);
    v.resize(n+1,vector<int>());
    for(int i=0;i<2*m;i+=2){
        fin >> muchii[i].a >> muchii[i].b >> muchii[i].capacitate;
        muchii[i+1].a=muchii[i].b;
        muchii[i+1].b=muchii[i].a;
        v[muchii[i].a].push_back(i);
        v[muchii[i+1].a].push_back(i+1);
    }
    int rasp=0;
    while(bfs()){
        for(int edge_from_dest_index : v[n]){
            int edge_to_dest_index = edge_from_dest_index^1;
            Muchie edge_to_dest = muchii[edge_to_dest_index];
            if(tata[edge_to_dest.a]==-1 or edge_to_dest.flux == edge_to_dest.capacitate)
                continue;
            tata[n]=edge_to_dest_index;
            int minim=INF;
            for(int i=n;i!=1;i=muchii[tata[i]].a)
                minim=min(minim,muchii[tata[i]].capacitate-muchii[tata[i]].flux);
            if(minim==0) continue;
            for(int i=n;i!=1;i=muchii[tata[i]].a){
                muchii[tata[i]].flux+=minim;
                muchii[tata[i]^1].flux-=minim;
            }
            rasp+=minim;
        }
    }
    fout << rasp;
    return 0;
}