Cod sursa(job #2962748)

Utilizator Cosmina_GheorgheGheorghe Cosmina Cosmina_Gheorghe Data 9 ianuarie 2023 00:10:05
Problema Flux maxim de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

int c[1024][1024],cost[1024][1024]; //capacitate intre doua noduri
int f[1024][1024]; //capacitate consumata
int tata[1024]; //tatal fiecarui nod
//vector<vector<int>> la; //lista de adiacenta
vector<int> la[1024];
//int coada[1024];
vector<int> vizitat,dist;
int nod,n,m,x,y,z,i,j,minn,flow,s,t,cost_fin,d;
// O(N * M^2)
int bf()
{
    vizitat.assign(n+1, 0);
    dist.assign(n+1, 99999);
    queue<int> coada;
	coada.push(s);
	tata[s]=s;
	dist[s]=0;
	vizitat[s]=1;
	while(!coada.empty())
    {
        nod=coada.front();
        coada.pop();
        vizitat[nod]=0; //il marchez ca nevizitat pt ca l am scos din coada
        if(nod == n) break; //opresc parcurgerea daca ajung la destinatie
        for(int j=0;j<la[nod].size();j++)
        {
            if(dist[la[nod][j]] > dist[nod]+cost[nod][la[nod][j]]&& c[nod][la[nod][j]]!=f[nod][la[nod][j]]) //si daca drumul nu a fost consumat
            {
                dist[la[nod][j]] = dist[nod]+cost[nod][la[nod][j]];
                tata[la[nod][j]]=nod;//retin tatal nodului
                if(vizitat[la[nod][j]]==0)
                {
                    coada.push(la[nod][j]);
                    vizitat[la[nod][j]];
                }
            }
        }
    }
    return dist[d];
}

int main()
{
    fin>>n>>m>>s>>d;
    //la.resize(n+1);
    for(i =0;i<m;i++){
  		fin>>x>>y>>z>>t;
  		la[x].push_back(y);
  		la[y].push_back(x);
  		c[x][y]=z;
  		cost[x][y]=t;
  		cost[y][x]=-t;
  	}

  	while(true)
    {
        cost_fin=bf();
        if(cost_fin==99999) break;


			int minn=9999999;
			for (j = nod; j!= s; 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 = nod; j!= s; j = tata[j]) //modific capacitatile drumurilor+ maresc flowul rezidual
            {
  				f[tata[j]][j] += minn;
  				f[j][tata[j]] -= minn;
  			}
  			flow=minn*cost_fin;

    }
    fout<<flow;


    return 0;
}