迪杰斯特拉算法
基础
邻接矩阵(Adjacency Matrix)
本质:一个二维数组,邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵
对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。
图转邻接矩阵
例子
本次以下图为例
根据程序提示生成矩阵并算出最短距离,以0
点为起点,算到其他点最短距离
代码实现
#include <stdio.h>
#include <iostream>
const int MAX = 100;
const int INFINITE = 0xFFFFF;
void print_matrix(int n, int matrix[MAX][MAX]);
void main()
{
int n, m; //点数和边数
int matrix[MAX][MAX];
int x, y, w;//两个点和之间的权值
int dist[MAX]; //存放距离
int flag[MAX]; //存放已找到最短距离的点
int vx = 0; //起点
int min;//最短距离
int u, v; // vx --> u -->v
printf("请输入顶点个数和边数,即除0和INF的点的个数,空格隔开\n");
scanf_s("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i==j)
{
matrix[i][j] = 0;
}
else
{
matrix[i][j] = INFINITE;
}
}
}
print_matrix(n, matrix);
printf("请输入两个顶点和他们之间的权值,空格隔开\n");
for (int j = 0; j < m; j++)
{
scanf_s("%d %d %d", &x, &y, &w);
matrix[x][y] = w;
}
print_matrix(n, matrix);
//查起点vx = 0到其他点的最短距离
for (int i=0;i<n;i++)
{
flag[i] = 0;
dist[i] = matrix[vx][i];
}
flag[vx] = 1; //起点到自己本身已获得最近距离为0
for (int i=1;i<n;i++) //除去本身还剩n-1个所以从1开始,减少一次
{
min = INFINITE;
for (int j=0;j<n;j++) //求当前dist数组中离第一个顶点距离最短的顶点的下标
{
if (!flag[j] && dist[j] < min)
{
min = dist[j];
u = j;
}
}
flag[u] = 1;
//若找到其他途径比从vx号顶点直接到目的顶点的距离短,则替换掉
for (int v=0;v<n;v++)
{
if (matrix[u][v]<INFINITE)
{
if (dist[v] > dist[u]+matrix[u][v])
{
dist[v] = dist[u] + matrix[u][v];
}
}
}
}
for (int i=0;i<n;i++)
{
printf("%d--->%d 最短距离:%d\n", vx, i, dist[i]);
}
system("pause");
}
void print_matrix(int n,int matrix[MAX][MAX])
{
int i, j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
运行结果如图