function [exitFlag exitMsg netStruct] = cfa_shortestPathInKmFixedUtilization (netStruct, algorithmParameters , net2planParameters)

	% Algorithm for capacity and flow assignment. The routing is the
	% shortest path in km. Then, the capacities in the links is computed to
	% match a given utilization value per link
	%
	% PARAM: rho | 0.6 | Utilization in the links

	%% Sanity checks
	rho = str2double(algorithmParameters.rho);
	assert(isfinite(rho) && rho > 0 && rho <= 1, '"rho" must be in range (0,1]');
	
	assert(isfield(netStruct, 'linkTable'), 'A set of links is required');
	assert(isfield(netStruct, 'demandTable'), 'A set of demandTable is required');

	% compute the routing
	[exitFlag exitMsg netStruct] = fa_shortestPath_km(netStruct, algorithmParameters, net2planParameters);
	if (exitFlag ~= 0), return; end

	% calculate the traffic per link
	E = size(netStruct.linkTable, 1);
	delta_pe = seqLinksPerPath2linkOccupancyPerPath(netStruct.pathList, E);
	y_e = trafficPerLink(netStruct.offeredTrafficInErlangs , netStruct.routingMatrix , delta_pe);

	% compute the capacities to match the utilization value
	netStruct.linkCapacityInErlangs = y_e / rho;
	exitFlag = 0;
	exitMsg = 'OK!';
		
end

