Cod sursa(job #3329733)

Utilizator Mirc100Mircea Octavian Mirc100 Data 15 decembrie 2025 13:19:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include<fstream>
#include<iostream>
#include <queue>
#include <cstring>
#define MAXN 10001
using namespace std;

int n, m;
int rezid[MAXN][MAXN];
vector<int> lrezid[MAXN];
int viz[MAXN], tata[MAXN];

int bfs() {
    int s = 0;
    int t = n - 1;

    for (int i = 0; i < n; i++) {
        viz[i] = 0;
        tata[i] = 0;
    }

    queue<int> q;
    q.push(s);
    viz[s] = 1;


    while (!q.empty()) {
        int x = q.front();
        q.pop();

        for (int y : lrezid[x]) {
            if (!viz[y] && rezid[x][y] > 0) {
                viz[y] = 1;
                tata[y] = x;

                if (y == t)
                    return 1;

                q.push(y);
            }
        }
    }
    return 0;
}

int main() {
    ifstream fs("maxflow.in");
    ofstream g("maxflow.out");

    fs >> n >> m;



    for (int i = 0; i < m; i++) {
        int x, y, c;
        fs >> x >> y >> c;
        x--; y--;


        lrezid[x].push_back(y);
        lrezid[y].push_back(x);

        rezid[x][y] += c;
    }

    fs.close();

    int fmax = 0;
    int s = 0;
    int t = n - 1;

    while (bfs()) {
        int iP = 110001;

         t=n-1;
        while(t!=0)  {

               if(iP>rezid[tata[t]][t])
                    iP= rezid[tata[t]][t];
                t=tata[t];
            }

        t=n-1;
         while(t!=0)  {
               rezid[tata[t]][t]-=iP;
                rezid[t][tata[t]]+=iP;
                t=tata[t];
          }

        fmax += iP;
    }

    g << fmax;
    g.close();

    return 0;
}