Cod sursa(job #2958952)

Utilizator Diana_14Diana Muscalu Diana_14 Data 29 decembrie 2022 13:15:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int c[1024][1024]; ///capacitate intre doua noduri
int f[1024][1024]; ///capacitate consumata
int tata[1024]; ///tatal fiecarui nod

vector<int> list_ad[1024];
vector<int> viz;
int nod, n, m, x, y, z, i, j, minn, flow;

int bfs()
{
    viz.assign(n+1, 0);
    queue<int> coada;
	coada.push(1); ///nodul de start
	while(!coada.empty())
    {
        nod = coada.front();
        coada.pop();
        viz[nod] = 1;
        if(nod == n)
            break; ///opresc parcurgerea daca ajung la destinatie
        for(int j = 0; j < list_ad[nod].size(); j++)
        {
            if(viz[list_ad[nod][j]] == 0 && c[nod][list_ad[nod][j]] > f[nod][list_ad[nod][j]]) ///daca nu e viz si daca drumul nu a fost consumat
            {
                coada.push(list_ad[nod][j]);
                viz[list_ad[nod][j]] = 1;
                tata[list_ad[nod][j]] = nod; ///retin tatal nodului
            }
        }
    }
    return viz[n];///ne zice daca a ajuns la final drumul -> nu s a gasit fluxul maxim deci continuam
}

int main()
{
    fin>>n>>m;
    //la.resize(n+1);
    for(i = 0; i < m; i++){
  		fin>>x>>y>>z;
  		list_ad[x].push_back(y);
  		list_ad[y].push_back(x);
  		c[x][y] = z;
  	}
  	flow = 0;
  	while(bfs())
    {
        for(i = 0; i < list_ad[n].size(); i++)
        {
            nod = list_ad[n][i];
			if (f[nod][n] == c[nod][n] || !viz[nod])
                continue;
			tata[n] = nod;
			int minn=9999999;
			for (j = n; j > 1; j = tata[j])
            {
  				minn = min(minn, c[tata[j]][j] - f[tata[j]][j]); ///calculez capacitatea minima a drumului (capacitate totala-consumata)
  			}
			if (minn == 0)
                continue;
			for (j = n; j > 1; j = tata[j]) ///modific capacitatile drumurilor si maresc flowul rezidual
            {
  				f[tata[j]][j] += minn;
  				f[j][tata[j]] -= minn;
  			}
  			flow = flow + minn;
        }
    }
    fout<<flow;
    return 0;
}