# 图的最短路径算法Dijkstra算法

#include <stdio.h>
#include <stdlib.h>

#define QUEUE_MAXSIZE 30
#define VERTEX_MAX 26
#define MAXVALUE 99999

typedef struct
{
char Vertex[VERTEX_MAX];//保存顶点信息，序号或字母
int Edges[VERTEX_MAX][VERTEX_MAX];//保存边的权
int isTrav[VERTEX_MAX];//遍历标志
int VertexNum;//顶点的数量
int EdgeNum;//边的数量
int GraphType;//图的类型，0：无向图；1：有向图
}MatrixGraph;

void CreateMatrixGraph(MatrixGraph *G);//创建邻接矩阵图
void OutMatrix(MatrixGraph *G);//输出邻接矩阵

/************************************************************************

************************************************************************/
void CreateMatrixGraph(MatrixGraph *G)
{
int i, j, k, weight;
char start, end;

printf("输入各个顶点的信息\n");
for (i = 0; i < G->VertexNum; i++)
{
getchar();
printf("第%d个顶点：", i+1);
scanf("%c", &(G->Vertex[i]));
}

printf("输入构成各边的两个顶点及权值（用逗号分隔）:\n");
for (k = 0; k < G->EdgeNum; k++)
{
getchar();
printf("第%d条边:", k+1);
scanf("%c,%c,%d", &start, &end, &weight);
for (i = 0; start != G->Vertex[i]; i++);//在已有顶点中查找起始点
for (j = 0; end != G->Vertex[j]; j++);//在已有顶点中查找终点
G->Edges[i][j] = weight;
if (G->GraphType == 0)
G->Edges[j][i] = weight;
}
}
/************************************************************************

************************************************************************/
void OutMatrix(MatrixGraph *G)
{
int i, j;
for (j = 0; j < G->VertexNum; j++)
{
printf("\t%c", G->Vertex[j]);
}
printf("\n");
printf("      ------------------------------------\n");
for (i = 0; i < G->VertexNum; i++)
{
printf("    %c |", G->Vertex[i]);
for (j = 0; j < G->VertexNum; j++)
{
if (G->Edges[i][j] == MAXVALUE)
printf("\t∞");
else
printf("\t%d", G->Edges[i][j]);
}
printf("\n");
}
printf("\n");
}

/************************************************************************

************************************************************************/
void Dijkstra(MatrixGraph G)
{
int weight[VERTEX_MAX];
int path[VERTEX_MAX];
int tmpvertex[VERTEX_MAX];

int i, j, k, v0, min;

printf("输入源点的编号：");
scanf("%d", &v0);
v0--;
for (i =0; i < G.VertexNum; i++)
{
weight[i] = G.Edges[v0][i];//保存最小权值
if (weight[i] < MAXVALUE && weight[i] > 0)
path[i] = v0;
tmpvertex[i] = 0;//初始化顶点集合为空
}
tmpvertex[v0] = 1;//将顶点v0添加到集合U中
weight[v0] = 0;
for (i = 0; i < G.VertexNum; i++)
{
min = MAXVALUE;
k = v0;
for (j = 0; j < G.VertexNum; j++)
{
if (tmpvertex[j] == 0 && weight[j] < min)
{
min = weight[j];
k = j;
}
}
tmpvertex[k] = 1;
for (j = 0; j < G.VertexNum; j++)
{
if (tmpvertex[j] == 0 && weight[k] + G.Edges[k][j] < weight[j])
{
weight[j] = weight[k] + G.Edges[k][j];
path[j] = k;
}
}
}
printf("\n顶点%c到各个顶点的最短路径为(终点 -- 源点)：\n", G.Vertex[v0]);
for (i = 0; i < G.VertexNum; i++)
{
if (tmpvertex[i] == 1)
{
k = i;
while (k != v0)
{
j = k;
printf("%c -- ", G.Vertex[k]);
k = path[k];
}
printf("%c\n", G.Vertex[k]);
}
else
printf("%c -- %c:无路径\n", G.Vertex[i], G.Vertex[v0]);
}
}
/************************************************************************

************************************************************************/
int main()
{
MatrixGraph G;
int i, j;
char select;

do
{
printf("输入生成图的类型(0:无向图,1:有向图):");
scanf("%d", &G.GraphType);

printf("输入图的顶点数量和边数量:");
scanf("%d,%d", &G.VertexNum, &G.EdgeNum);

//清空矩阵
for (i = 0; i < G.VertexNum; i++)
for (j = 0; j < G.VertexNum; j++)
G.Edges[i][j] = MAXVALUE;

CreateMatrixGraph(&G);
printf("邻接矩阵数据如下:\n");
OutMatrix(&G);

printf("最短路径:\n");
Dijkstra(G);
printf("继续进行吗？(Y/N)");
scanf("%c", &select);
getchar();
}while (select != 'N' && select != 'n');

getchar();
getchar();
return 0;
}  

• 本文已收录于以下专栏：

## 最短路径 Dijkstra算法

//最短路径 Dijkstra算法 #include using namespace std; int n; //节点数目 int dist[102]; //到节点1的最短路径值 bool v...

## 最短路径(Dijkstra算法)

Dijkstra算法是典型最短路算法，用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展，直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解，但由于它遍历计算的...

## Dijkstra最短路径算法

１  最短路径算法 在日常生活中，我们如果需要常常往返A地区和B地区之间，我们最希望知道的可能是从A地区到B地区间的众多路径中，那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题， 旨...

## 最短路径算法dijkstra

//主要源代码 #include #include #include #define INF 999999 #define MAX_NAME 3 #define VERTEX_MAX_NUM 1...

## Dijkstra 最短路径算法

Dijkstra算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的，因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法，解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为...

## Dijkstra最短路径算法

// Dijkstra.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #define MAX 100 #define INF 0x7ffff typede...

## 最短路径 Dijkstra算法

#include "stdio.h" #define INFINITY 100 #define MAX_VERTEX_NUM 20 struct MGraph { char vexs[MAX_V...

## Dijkstra — 最短路径算法

Dijkstra算法，狄克斯特拉算法，在有向图中搜索最短路径。 算法实现的主要步骤： （1） 初始化 所有点都初始化为没有被访问，初始化根结点到各结点的距离，存放在lowcost[]数组中； （...

## Dijkstra算法（最短路径）

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)