Preguntas de preparación del segundo modelo de estructura de datos (4)

[Descripción del problema]
Suponga que un gráfico no dirigido ponderado representa la red de líneas de autobús en un área determinada. Los vértices en el gráfico representan lugares importantes en algunas áreas, los arcos representan las líneas de autobús existentes y la derecha en el arco representa los boletos en El precio (o el tiempo requerido para el viaje) <peso>, intente diseñar un sistema de guía de tráfico para guiar al solicitante a ir de un lugar en el área a otro lugar con la tarifa más baja o el menor tiempo. Ahora genere la tarifa más baja del 1 al enésimo lugar.
Requisitos experimentales: use el algoritmo de Dijkstra para encontrar la tarifa más baja
[formulario de entrada]
Primero, ingrese una n, lo que significa que hay n (número 1-n) lugares, m significa que hay m bordes y luego m líneas, ingrese a, b para cada línea, C Tres números enteros positivos (separados por espacios). Significa que hay una tarifa c entre ayb
(este es un <gráfico no dirigido>).
(2 <= n <= 100, 1 <= m <= 1000, 1 <= a, b <= n, 1 <= c <= 100)
[Forma de salida]
es una salida simplificada, solo la ubicación de salida 1 an La tarifa más baja en cada lugar.
[Entrada de muestra]
5 6
1 4 30
1 2 10
4 3 20
2 3 50
4 5 60
3 5 10
[Salida de muestra]
60

[Idea de título]
Operaciones relacionadas del algoritmo dijkstra.

【Código de referencia】

#include <stdio.h>
#include <string.h>

#define INF 0x3f3f3f3f

int n,m;
int map[101][101];
int dist[101];
int visited[101];

void dijkstra()
{
    
    
    memset(visited,0,sizeof(visited));
	int i,j;
	for(i=1;i<=n;i++)
	 dist[i]=map[1][i];
	
	visited[1]=1;
	
	for(i=1;i<n;i++)
	{
    
    
		int min=INF,pos=-1;
		for(j=1;j<=n;j++)
		{
    
    
			if(visited[j]==0&&dist[j]<min)
			{
    
    
				min=dist[j];
				pos=j;
			}
		}
		
		if(pos==-1)
		 break;
		else
		 visited[pos]=1;
		
		for(j=1;j<=n;j++)
		{
    
    
			if(visited[j]==0&&dist[j]>dist[pos]+map[pos][j])
			 dist[j]=dist[pos]+map[pos][j];
		}
	}
}

int main()
{
    
    
	int i,a,b,c;
	scanf("%d%d",&n,&m);
	
	memset(map,INF,sizeof(map));
	for(i=1;i<=n;i++)
	 map[i][i]=0;
	
	for(i=0;i<m;i++)
	{
    
    
		scanf("%d%d%d",&a,&b,&c);
		if(map[a][b]>c)
		 map[a][b]=map[b][a]=c;
	}
	
	dijkstra();
	printf("%d",dist[n]);
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/qq_46139801/article/details/114143318
Recomendado
Clasificación