图--Dijkstra算法

声明:dijkstra.h文件 

#pragma once
#ifndef DIJKSTRA_H
#define DIJKSTRA_H
#define X 999
#define Max 6
#define Nopath -1
#include <stdio.h>
#include "DIJKSTRA.h" 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//图
//顶点
typedef struct node
{
	int path; //上一站顶点 
	int visited; //有没有读取完成(标记)
	int distance; //距离 
	char name;
}Node;
typedef Node* TABLE;

void InitializeTable(int start, TABLE T[]); //初始化表,该表用于保存各个顶点的数据


//优先队列
typedef struct PriorityQueue
{
	int size; //当前优先队列里顶点数 
	int capacity; //队列容量 
	TABLE element[Max];
}Queue;
typedef Queue* QUEUE;

QUEUE InitializeQueue(int capacity); //优先队列初始化
void enqueue(QUEUE Q, TABLE K); //入队
int dequeue(QUEUE Q); //出队
void Dijkstra(int const(*map)[Max], int start, TABLE T[]); //迪杰斯特拉算法
void ShowTable(TABLE T[]); //打印表中数据  


#endif

源代码:

#include "DIJKSTRA.h"

//声明一个图
const int map[6][6] = {
				/*A*/	{0,5,1,X,X,X},
				/*B*/	{5,0,2,1,X,X},
				/*C*/	{1,2,0,4,8,X},
				/*D*/	{X,1,4,0,3,6},
				/*E*/	{X,X,8,3,0,X},
				/*F*/	{X,X,X,6,X,0},
};

//初始化表,该表用于保存各个顶点的数据
void InitializeTable(int start, TABLE T[])
{
	int i;
	for (i = 0; i < Max; i++)
	{
		T[i] = (Node*)malloc(sizeof(Node));
		T[i]->visited = 0;
		T[i]->path = Nopath;
		T[i]->distance = X;
		T[i]->name = 65 + i;//ASCII A B C  D E F 
	}
	T[start]->distance = 0;
}

//初始化优先队列
QUEUE InitializeQueue(int capacity)
{
	QUEUE Q;
	Q = (Queue*)malloc(sizeof(Queue));
	Q->capacity = capacity;
	Q->size = 0;

	for (int i = 1; i < Max; i++)
	{
		Q->element[i] = NULL;
	}

	Q->element[0] = (Node*)malloc(sizeof(Node));
	Q->element[0]->distance = 0;

	return Q;
}

//入队
void enqueue(QUEUE Q, TABLE K)
{
	int i, hole;

	if (K->path == Nopath)
	{
		Q->size++;
		hole = Q->size;
	}
	else
	{
		i = 1;

		while (K->name != Q->element[i]->name && Q->element[i] != NULL)
		{
			i++;
		}

		hole = i;
	}

	i = hole / 2;

	while (K->distance < Q->element[i]->distance)
	{
		Q->element[hole] = Q->element[i];
		hole = i;
		i = i / 2;
	}

	Q->element[hole] = K;
}

//出队
int dequeue(QUEUE Q)
{
	TABLE OUT;
	int hole = 1, child = 2, last = Q->size;
	OUT = Q->element[1];
	Q->size--;

	while (child <= Q->size && Q->element[child]->distance < Q->element[last]->distance)
	{
		if (Q->element[child]->distance > Q->element[child + 1]->distance)
		{
			child++;
		}

		Q->element[hole] = Q->element[child];
		hole = child;
		child = hole * 2;
	}

	Q->element[hole] = Q->element[last];
	Q->element[last] = NULL;

	return OUT->name - 65;
}

//迪杰斯特拉算法
void Dijkstra(int const(*map)[Max], int start, TABLE T[])
{

	int current;
	InitializeTable(start, T);
	QUEUE Q;
	Q = InitializeQueue(Max);
	enqueue(Q, T[start]);

	while (Q->size != 0)
	{
		current = dequeue(Q);

		for (int i = 0; i < Max; i++)
		{
			int EdgeLength = map[current][i];

			if (EdgeLength != 0 && EdgeLength != X && T[i]->visited == 0)
			{
				if (T[i]->distance > EdgeLength + T[current]->distance); //贪婪的判断
				{
					T[i]->distance = EdgeLength + T[current]->distance;
					enqueue(Q, T[i]);
					T[i]->path = current;
				}
			}
		}

		T[current]->visited = 1;
	}
}

//打印表中数据
void ShowTable(TABLE T[])
{
	int i;
	printf("name	visited		dis	  path\n");
	for (i = 0; i < Max; i++)
	{
		printf("%c:	%d		%d	  %c\n", T[i]->name, T[i]->visited, T[i]->distance, T[i]->path + 65);
	}
}


//主函数
int main(void)
{
	TABLE T[Max];
	Dijkstra(map, 0, T);
	ShowTable(T);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值