Le langage C implémente l'algorithme de Dixtra

#Utilisation du langage c pour implémenter l'algorithme de Dikstra
Il existe des algorithmes matures pour trouver le chemin le plus court, comme l'algorithme de Dikstra.L'idée est de trouver la distance la plus courte de chaque sommet tour à tour de près à loin par distance.

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

Ensuite, nous allons trier l'entrée de la matrice de distance depuis le clavier et la sortie:

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");
}

Nous savons que le cœur de l'algorithme de Dixter est de mettre à jour la matrice d'affectation pour trouver le chemin le plus court. Par conséquent, nous devons mettre à jour le chemin le plus court. Le code est le suivant:

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

En langage C, en utilisant la partie centrale de l'algorithme de Dijkstra et en appelant les fonctions ci-dessus, le code disponible est:

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 fonction principale est d'assigner des valeurs à la matrice de distance et d'appeler d'autres fonctions pour enfin obtenir l'algorithme de Dikstra complet:

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();
}

Code complet obtenu:

#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();
}

Par exemple, nous pouvons utiliser le code ci-dessus pour trouver la distance la plus courte dans la figure ci-dessous
Insérez la description de l'image ici

En appelant cette fonction, nous obtenons
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_41516983/article/details/115272181
conseillé
Classement