Cod sursa(job #3184915)

Utilizator iulia_tamasTamas Iulia iulia_tamas Data 17 decembrie 2023 12:59:27
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

#define maxx INT_MAX
#define N 1001
int cap[N][N], flux[N][N];
vector<int> t;
int n, m;

int bfs (int s, int d){
    deque<int> Q;
    vector<int> use(N, 0);
    t.assign(N, 0);
    Q.push_back(s);
    use[s]=1;
    while(!Q.empty()){
        int nod = Q.front();
        Q.pop_front();
        if(nod==d) break;
        for(int i=1; i<=n; i++){
            if(cap[nod][i]!=0 and !use[i]){
                if((cap[nod][i]-flux[nod][i])>0){
                    Q.push_back(i);
                    t[i]=nod;
                    use[i]=1;
                }
            }
        }
    }
    if(t[d]) return 1;
    return 0;
}

int edmond_karp(int s, int d){
    int flow = 0;
    int i, mini;
    while(bfs(s,d)){
        mini= maxx;
        i=d;
        while(t[i]!=0){
            if((cap[t[i]][i] - flux[t[i]][i] )< mini)
                mini = (cap[t[i]][i] - flux[t[i]][i]);
            i=t[i];
        }
        i=d;
         while(t[i]!=0){
            flux[t[i]][i] += mini;
            flux[i][t[i]] -= mini;
            i=t[i];
        }
        flow += mini;
    }
    return flow;
}

int dinic(int s, int d){
    int flow=0;
    int i,j, mini;
    while(bfs(s,d)){
        //cout<<"ad";
        for(j=s; j<d; ++j){
            if((cap[j][d]-flux[j][d])>0){
                mini=maxx;
                if((cap[j][d]-flux[j][d])<mini)
                    mini=(cap[j][d]-flux[j][d]);

                i=j;
                 while(t[i]!=0){
                    if((cap[t[i]][i] - flux[t[i]][i])< mini)
                        mini = (cap[t[i]][i] - flux[t[i]][i]);
                    i=t[i];
                }

                if(mini==maxx) continue;
                    flux[j][d] += mini;
                    flux[d][j] -= mini;

                i=j;
                 while(t[i]!=0){
                    flux[t[i]][i] += mini;
                    flux[i][t[i]] -= mini;
                    i=t[i];
                }
                flow += mini;
            }
        }
    }
    return flow;
}

int main()
{
    int s, d,x,y,c;
    fin>>n>>m;
    s=1;
    d=n;
    for(int i=1; i<=m; i++){
        fin>>x>>y>>c;
        cap[x][y]=c;
    }
    fout<<dinic(s,d);
    return 0;
}