El lenguaje C implementa el algoritmo de Dixtra

#Utilizando el lenguaje c para implementar el algoritmo de Dikstra
Existen algoritmos maduros para encontrar el camino más corto, como el algoritmo de Dikstra, la idea es encontrar la distancia más corta de cada vértice a su vez de cerca a lejos en la distancia.

  首先,构建结构体,其代码如下:
struct Dijkstra {
    
    
	int w[Maxsize][Maxsize];                     //权重距离矩阵
	int l[Maxsize];                              //依次求得各点到起点的最短距离
	int s;                                       //顶点个数
}path;

Luego, ordenaremos la entrada de la matriz de distancia desde el teclado y la salida:

void Dijkstra_mat()
{
    
    
	for (int i = 0; i < path.s; i++)
	{
    
    
		for (int j = 0; j < path.s; j++)
		{
    
    
			printf("%-6d", path.w[i][j]);
		}
		printf("\n");
	}
	printf("********************\n");
}

Sabemos que el núcleo del algoritmo de Dixter es actualizar la matriz de asignación para encontrar la ruta más corta. Por lo tanto, necesitamos actualizar la ruta más corta. El código es el siguiente:

int min(int a, int b)                            //更新赋值路
{
    
    
	if (a <= b)
		return a;
	if (a > b)
		return b;
}

En el lenguaje C, usando la parte central del algoritmo de Dijkstra y llamando a las funciones anteriores, el código disponible es:

void Dijkstra()
{
    
    
	int u = 0, v;          //u为起点,v为距u最短点
	for (int i = 0; i < path.s; i++)
	{
    
    
		for (int v = 0; v < path.s; v++)
		{
    
    
			path.l[v] = min(path.l[v], path.l[u] + path.w[u][v]);
		}
		u = the_mins(u);
		i++;
	}
	for (int j = 0; j < path.s; j++)
	{
    
    
		printf("到第%d个地方的距离为%4d\n", j + 1, path.l[j]);
	}
}

La función principal es asignar valores a la matriz de distancias y llamar a otras funciones para finalmente obtener el algoritmo Dikstra completo:

int main()
{
    
    
	int path_sum = 0;                                //最初的路径为0 
	printf("请输入顶点个数:");
	scanf_s("%d", &path.s);
	printf("请输入距离矩阵:");
	for (int i = 0; i < path.s; i++)                  //距离赋权矩阵赋值
	{
    
    
		for (int j = 0; j < path.s; j++)
		{
    
    
			scanf_s("%d", &path.w[i][j]);
			if (path.w[i][j] == -1)
				path.w[i][j] = INF;
			printf("   ");
		}
		printf("\n");
	}
	for (int i = 0; i < path.s; i++)
	{
    
    
		if (i == 0)
			path.l[i] = 0;
		else
			path.l[i] = INF;
	}
	printf("得到的距离矩阵为:\n");
	Dijkstra_mat();
	Dijkstra();
}

Código completo obtenido:

#include<stdio.h>

#define INF 9999
#define Maxsize 50

struct Dijkstra {
    
    
	int w[Maxsize][Maxsize];                     //权重距离矩阵
	int l[Maxsize];                              //依次求得各点到起点的最短距离
	int s;                                       //顶点个数
}path;

int min(int a, int b)                            //更新赋值路
{
    
    
	if (a <= b)
		return a;
	if (a > b)
		return b;
}

void Dijkstra_mat()
{
    
    
	for (int i = 0; i < path.s; i++)
	{
    
    
		for (int j = 0; j < path.s; j++)
		{
    
    
			printf("%-6d", path.w[i][j]);
		}
		printf("\n");
	}
	printf("********************\n");
}
int the_mins(int u)                        //以距离上一个点最短的点为起点
{
    
    
	int v = u, j = 0;
	int min, step;
	for (int i = 0; i < path.s; i++)
	{
    
    
		if (path.l[i] > path.l[u])
		{
    
    
			j++;
			if (j == 1)
			{
    
    
				step = path.l[i];
				min = path.l[i];
				v = i;
			}
			if (path.l[i] < step)
			{
    
    
				min = path.l[i];
				v = i;
			}
		}
	}
	return v;
}

void Dijkstra()
{
    
    
	int u = 0, v;          //u为起点,v为距u最短点
	for (int i = 0; i < path.s; i++)
	{
    
    
		for (int v = 0; v < path.s; v++)
		{
    
    
			path.l[v] = min(path.l[v], path.l[u] + path.w[u][v]);
		}
		u = the_mins(u);
		i++;
	}
	for (int j = 0; j < path.s; j++)
	{
    
    
		printf("到第%d个地方的距离为%4d\n", j + 1, path.l[j]);
	}
}

int main()
{
    
    
	int path_sum = 0;                                //最初的路径为0 
	printf("请输入顶点个数:");
	scanf_s("%d", &path.s);
	printf("请输入距离矩阵:");
	for (int i = 0; i < path.s; i++)                  //距离赋权矩阵赋值
	{
    
    
		for (int j = 0; j < path.s; j++)
		{
    
    
			scanf_s("%d", &path.w[i][j]);
			if (path.w[i][j] == -1)
				path.w[i][j] = INF;
			printf("   ");
		}
		printf("\n");
	}
	for (int i = 0; i < path.s; i++)
	{
    
    
		if (i == 0)
			path.l[i] = 0;
		else
			path.l[i] = INF;
	}
	printf("得到的距离矩阵为:\n");
	Dijkstra_mat();
	Dijkstra();
}

Por ejemplo, podemos usar el código anterior para encontrar la distancia más corta en la figura siguiente
Inserte la descripción de la imagen aquí

Al llamar a esta función, obtenemos
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_41516983/article/details/115272181
Recomendado
Clasificación