Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - castrokin

Páginas: [1]
1
Hola Chicos espero puedan ayudarme con esta asignación.

Se me pide saber la ruta más corta desde el nodo O al nodo T. Los números que se muestran en las aristas representan la distancia entre los nodos.



Debo elaborar un programa en C++ que encuentre la ruta más corta entre los nodos O y T utilizando el algoritmo de Dijkstra.

Este es mi código

Código: [Seleccionar]
#include <iostream>
#include <queue>
#include <vector>
#define MAXV 100 // Maxima cantidad de vertices.
#define oo 0x3f3f3f3f // Nuestro valor infinito.
using namespace std;


struct Edge
{
int node; // El nodo destino de la arista.
int cost; // El costo de la arista.
Edge(int _node, int _cost) : node(_node), cost(_cost) {} // Constructor parametrizado.
Edge() : node(-1), cost(-1) {} // Constructor por defecto.
};

struct Graph
{
vector<Edge> G[MAXV]; // Lista de adyacencias.
int V; // Cantidad de vertices.
int E; // Cantidad de aristas.
};

struct State
{
int node; // El nodo actual.
int cost; // El costo del camino.
State(int _node, int _cost) : node(_node), cost(_cost) {} // Constructor parametrizado.
bool operator <(const State &b) const // Sobrecarga del operador de prioridad <.
{
return cost > b.cost;
}
};

int algoritmo(const int begin, const int end, const Graph graph)
{
priority_queue<State> pq; // La cola de prioridad.
vector<int> Dist(graph.V, oo); // La distancia hacia todos los vertices. Inicialmente para cada vertice su valor es infinito.
vector<bool> mark(graph.V, false); // Este arreglo nos permitira determinar los nodos procesados.

Dist[begin] = 0; // Valor inicial del vertice de partida.
pq.push(State(begin, 0)); // Agregamos el primer elemento, que no es mas que el vertice de partida.
while(!pq.empty()) // Mientras existan vertices por procesar.
{
State st = pq.top(); pq.pop(); // Se desencola el elemento minimo.
mark[st.node] = true; // Se marca el nodo como visitado.
if (st.node == end)
return st.cost; // Retornamos el valor del camino, hemos llegado al vertice destino.

int T = (int)graph.G[st.node].size();
for(int i = 0; i < T; ++i) // Se recorren las adyacencias de "a".
{
// Si no ha sido procesado el vertice "vi" y la distancia hacia "vi" es menor a la distancia
// en Dist entonces hemos encontrado un camino mas corto a "vi".
if (!mark[graph.G[st.node][i].node] && ((Dist[st.node] + graph.G[st.node][i].cost) < Dist[graph.G[st.node][i].node]))
{
Dist[graph.G[st.node][i].node] = st.cost + graph.G[st.node][i].cost;
pq.push(State(graph.G[st.node][i].node, st.cost + graph.G[st.node][i].cost));
}
}
}
return -1; // Si no se puede llegar al destino, retornar -1.
}

struct Programa
{
int V, E;
int comienzo, fin;
void definirGrafo(Graph& graph)
{
cout << "Ingrese Cantidad de Vertices: " << endl;
cin >> V;
cout << "Ingrese Cantidad de Aristas: " << endl;
cin >> E;

graph.V = V;
graph.E = E;
}
void cargarGrafo(Graph & graph)
{
for (int i = 0; i < E; ++i)
{
int Origen, Destino, Peso;
cout << "Ingrese Origen: " << endl;
cin >> Origen;
cout << "Ingrese Destino: " << endl;
cin >> Destino;
cout << "Ingrese Peso de la Arista: " << endl;
cin >> Peso;

// Insertamos la arista dos veces, ya que nuestro grafo es un grafo no dirigido.
graph.G[Origen].push_back(Edge(Destino, Peso));
graph.G[Destino].push_back(Edge(Origen, Peso));
}
}
void Dijkstra(Graph graph)
{
cout << "Ingrese Vertice Inicial: " << endl;
cin >> comienzo;
cout << "Ingrese Vertice Final: " << endl;
cin >> fin;
int n = algoritmo(comienzo, fin, graph);
cout << "Longitud del Camino mas Corto: " << n << endl;
}
};

int main()
{
bool out=false;
char salir;

Programa programa; //TAD
Graph graph; // Grafo.

cout << "Algoritmo de Dijkstra en C++" << endl;

while (!out)
{
programa.definirGrafo(graph); //Se define cantidad de vertices y cantidad de aristas del grafo
programa.cargarGrafo(graph); //Se cargan las aristas del Grafo
programa.Dijkstra(graph); //Se aplica el algoritmo de Dijkstra

//Desea Salir?
cout << "Salir? (S/N)" << endl;
cin >> salir;
if (salir == 'S')
{
out = true;
}
}
}

Mi duda es

Sera este el mejor enfoque para darle o ustedes creen que se puede cambiar algo

Muchas gracias a todos

2
Buenas amigos me gustaría que me pudiesen ayudar con este programa en Pascal que debo crear y me está dando bastantes quebraderos de cabeza

Se me pide crear un programa que permita ingresar el nombre y el salario de los trabajadores de una empresa. así como también poder consultarlos y eliminarlos. También se me pide crear un promedio de sueldos entre trabajadores que ganen mas de 1500 y menos o igual a 1500 respectivamente.

este seria el código

Código: [Seleccionar]
program ACME;
 
type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anu: real;
 
sal_anual: real;
 
sal_men: real;
 
sal_mensual: real;
 
utili, utilidades, vaca, vacaciones: real;
 
bono: real;
 
cedula :integer;
 
    end;
 
const
 
capacidad = 1000;
 
var
 
tra: array[1..capacidad] of tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
cesta: integer;
 
seBorro:boolean;
 
acum :real;
 
acum2 :real;
 
sum : real;
 
 
 
 
 
{Cuerpo del programa principal}
 
begin
 
cantidad := 0;
 
    repeat
 
        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1: { Agregar trabajador }
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
                    Write('Introduzca el nombre: ');
 
                    ReadLn(tra[cantidad].nombre);
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
 
for i:=1 to cantidad do
 
begin
 
if tra[i].salario > 1500 then begin
 
with tra[i] do begin
 
bono:=tra[i].salario*0.1;
 
utilidades:=tra[i].salario*2;
 
vacaciones:=tra[i].salario;
 
sal_mensual:=tra[i].salario+tra[i].bono;
 
sal_anual:=tra[i].sal_mensual*12+tra[i].vacaciones+tra[i].utilidades;
 
end;
 
end;
 
if tra[i].salario <= 1500 then
 
begin
 
cesta:=20;
 
with tra[i] do begin
 
vaca:=salario;
 
utili:=salario*4;
 
sal_men:=salario+cesta;
 
sal_anu:=sal_men*12+tra[i].vaca;
 
end;
 
end;
 
end;
 
end;
 
            2: begin {Todos los trabajadores}
 
if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i, ' ', tra[i].nombre, tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}
 
                begin
 
Write('Escriba el nombre del trabajador ');
 
ReadLn( textoBuscar );
 
encontrado := false;
 
for i := 1 to cantidad do
 
if pos (textoBuscar, tra[i].nombre) > 0 then
 
begin
 
encontrado := true;
 
WriteLn( i,' - Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
 
end;
 
if not encontrado then
 
WriteLn('No se ha encontrado.');
 
WriteLn;
 
                end;
 
            4:  {Reporte 1 }
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Bono: ', tra[i].bono:4:2);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Cestaticket: ', cesta);
 
WriteLn('Total: ', tra[i].sal_men:4:2);
 
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
 
readln(textoBuscar);
 
seBorro := false;
 
for i := 1 to capacidad do begin
 
{ReadLn(tra[cantidad].nombre);}
 
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
 
with tra[i] do begin
 
nombre:='';
 
salario:=0;
 
sal_anu:=0.0;
 
sal_anual:=0.0;
 
sal_men:=0.0;
 
sal_mensual:=0.0;
 
utili:=0;
 
utilidades:=0;
 
vaca:=0;
 
vacaciones:=0;
 
bono:=0;
 
end;
 
end;
 
end;
 
            7: {Promedio Nomina Mayor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario > 1500 then
 
begin
 
acum := acum+ tra[i].sal_anual:4:2;
 
end;
 
writeln('Promedio Nomina Mayor es: ' acum/tra[cantidad].nombre:4:2);
end;
end;
 
            8: {Promedio Nomina Menor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario <= 1500 then
 
begin
 
acum := acum+ tra[i].sal_anu:4:2;
 
end;
 
writeln('Promedio Nomina Menor es: ' acum/tra[cantidad].nombre:4:2)
 
            9: {Promedio general}
 
begin
 
for i := 1 to capacidad do begin
 
begin
 
sum := acum2+ acum;
 
end;
 
writeln('Promedio general es: ' sum/tra[cantidad].nombre:4:2);
 
end;
 
           0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

El problema ocurre es cuando escribo los promedios de sueldos anuales para los trabajadores que ganan mas de 1500

Código: [Seleccionar]
7: {Promedio Nomina Mayor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario > 1500 then
 
begin
 
acum := acum+ tra[i].sal_anual:4:2;
 
end;
 
writeln('Promedio Nomina Mayor es: ' acum/tra[cantidad].nombre:4:2);
end;
end;

el código para el promedio de salario anual para trabajadores que ganan menos o igual a 1500

Código: [Seleccionar]
8: {Promedio Nomina Menor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario <= 15 then
 
begin
 
acum := acum+ tra[i].sal_anu:4:2;
 
end;
 
writeln('Promedio Nomina Menor es: ' acum/tra[cantidad].nombre:4:2)
end;
end;


y para el promedio de sueldos de todos los trabajadores.

al compilar aparecen los siguientes errores

Compiling prueba7.pas
prueba7.pas(309,5) Error: Label used but not defined "7"
prueba7.pas(309,5) Fatal: Syntax error, ";" expected but "BEGIN" found
Fatal: Compilation aborted

y no puedo saber si el resto del código compila correctamente.

mi pregunta es porque me ocurre ese error y como poder solucionarlo

esperando su pronta respuesta

muchas gracias

Páginas: [1]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".