#c言語を使用したダイクストラのアルゴリズムの実装ダイクストラのアルゴリズム
など、最短経路を見つけるための成熟したアルゴリズムがあります。アイデアは、各頂点の最短距離を近くから遠くまで順番に見つけることです。
首先,构建结构体,其代码如下:
struct Dijkstra {
int w[Maxsize][Maxsize]; //权重距离矩阵
int l[Maxsize]; //依次求得各点到起点的最短距离
int s; //顶点个数
}path;
次に、キーボードから入力された距離行列と出力を並べ替えます。
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 min(int a, int b) //更新赋值路
{
if (a <= b)
return a;
if (a > b)
return b;
}
C言語では、ダイクストラのアルゴリズムのコア部分を使用し、上記の関数を呼び出すと、使用可能なコードは次のようになります。
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();
}
取得した完全なコード:
#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();
}
たとえば、上記のコードを使用して、下の図で最短距離を見つけることができます
この関数を呼び出すと、次のようになります。