狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

图的邻接表实现迪杰斯特拉算法(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[]

**************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值