图的邻接表实现迪杰斯特拉算法(C语言)
/*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/
//算法实现:
#include
#include
#define MAX 20
#define MAX_FLOAT_NUM 1000 /*最大浮点数(假设最大浮点数是1000)*/
typedef int infoType; /*定义边表结点权值的数据的数据类型*/
typedef int vertexType; /*定义顶点结点上存储的数据的数据类型*/
//定义边表结点结构体
typedef struct edgenode {
int adjvertex; //边表结点域
infoType info; //边表结点权值,这里存放的是其父结点到该结点的距离
struct edgenode *next; //指向下一个邻接点的指针域
} EdgeNode;
//定义顶点结点结构体
typedef struct vertexnode {
vertexType boolval; /* 顶点结点域,这里存放的是该结点是否找到其距源顶点最短路径的标记,
若找到最短路径,则该值为1,否则该值为0 */
EdgeNode *firstedge; //边表头指针
} VertexNode;
typedef struct {
VertexNode adjlist[MAX]; /*邻接表*/
int vertexNum; /*顶点数*/
int edgeNum; /*边数*/
} ALGraph; //adjacency list graph:邻接表
/**************************************************************
函数名称:CreateGraph
函数功能:创建邻接表
输入:顶点数vertexNum,边数edgeNum
输出:指向已创建好的邻接表的指针
**************************************************************/
ALGraph* CreateGraph(int vertexNum, int edgeNum) {
int k;
EdgeNode *p;
//声明图的邻接表
ALGraph *G;
G = (ALGraph *)malloc(sizeof(ALGraph));
if (!G) {
G = NULL;
}
else {
G->vertexNum = vertexNum;
G->edgeNum = edgeNum;
//建立顶点表
for (k = 0; k < G->vertexNum; k ++) {
G->adjlist[k].boolval = 0; /*boolval值判断该结点到源结点的距离是否是最短距离,是1表示已达最短距离,是0表示还没有达最短距离*/
G->adjlist[k].firstedge = NULL;
}
//建立边表
printf("请输入顶点、其邻接顶点和权值信息:\n");
for(k = 0; k < G->edgeNum; k ++) {
int i, j;
infoType info;
//表现的是边的关系,有多少对就有多少边,所以for循环次数为G->edgeNum
scanf("%d,%d,%d",&i,&j,&info);
if (i != j) {
p = (EdgeNode *)malloc(sizeof(EdgeNode));
p->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge = p;
p->adjvertex = j;
p->info = info;
}
}
}
return G;
}
/**************************************************************
函数名称:dijkstra(迪杰斯特拉/迪斯奎诺)
函数功能:实现迪杰斯特拉算法,找出每个顶点到源定点u的最短距离
输入:邻接表指针G,源顶点u,记录每个顶点到源顶点的最短距离的数组d[],到源顶点的最短路径上的前方顶点编号p[]
输出:记录每个顶点到源顶点的最短距离的数组d[],到源顶点的最短路径上的前方顶点编号p[]
**************************************