Dijkstra算法求最短路径

 摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除。

Dijkstra算法求最短路径_第1张图片

Dijkstra算法求最短路径_第2张图片

Dijkstra算法求最短路径_第3张图片

Dijkstra算法求最短路径_第4张图片

算法过程详见http://blog.csdn.net/cjc211322/article/details/24933909

/*
	有向图的构建及最短路径求解(Dijkstra)
*/
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 30
#define MAX_INT 1000

typedef int VrType;
typedef char VtType;
bool visted[MAX_VERTEX_NUM];		//搜索时的标记矩阵

typedef struct ARC					//用于表征图的连接关系
{
	VrType adj;						//连接关系
	ARC *info;						//附加信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct						//定义图的完整结构
{
	VtType vertex[MAX_VERTEX_NUM];	//顶点		
	AdjMatrix arcs;					//邻接矩阵
	int vertexnum,arcnum;			//弧线和顶点的数目
}MGraph;

typedef struct node					//FIFO链表(队列)
{
	int vid;
	struct node* next;
}Queue;

Queue* head=NULL; 

void CreateG(MGraph &G)				//创建图
{
	int i,j;

	printf("Construct the Graph...\n");
	G.vertexnum=5;
	G.arcnum=7;

	for(i=0;i<MAX_VERTEX_NUM;i++)	//邻接矩阵的初始化
	{
		for(j=0;j<MAX_VERTEX_NUM;j++)
		{
			if(i==j)
			{
				G.arcs[i][j].adj=0;
				G.arcs[i][j].info=NULL;
			}
			else
			{
				G.arcs[i][j].adj=MAX_INT;
				G.arcs[i][j].info=NULL;
			}
		}
	}

	G.vertex[0]='1';				//顶点赋值
	G.vertex[1]='2';
	G.vertex[2]='3';
	G.vertex[3]='4';
	G.vertex[4]='5';
	
	G.arcs[0][1].adj=10;			//邻接矩阵赋值
	G.arcs[0][1].info=NULL;

	G.arcs[1][2].adj=50;
	G.arcs[1][2].info=NULL;

	G.arcs[0][3].adj=30;
	G.arcs[0][3].info=NULL;

	G.arcs[0][4].adj=100;
	G.arcs[0][4].info=NULL;

	G.arcs[2][4].adj=10;
	G.arcs[2][4].info=NULL;

	G.arcs[3][2].adj=20;
	G.arcs[3][2].info=NULL;

	G.arcs[3][4].adj=60;
	G.arcs[3][4].info=NULL;

	printf("Construction of Graph OK!\n\n");
	return;
}

void ShowAdjMat(MGraph G)			//邻接矩阵的显示
{
	int i,j;

	printf("The adjacent matrix is:\n");
	for(i=0;i<G.vertexnum;i++)
	{
		for(j=0;j<G.vertexnum;j++)
		{
			printf("%d\t",G.arcs[i][j].adj);
		}
		printf("\n");
	}
	printf("\n");

	return;
}

void addnode(Queue* head,int v)		//链表添加新节点
{
	Queue* temp,*newnode;

	if(head==NULL)
	{
		head=(Queue*)malloc(sizeof(Queue));
		head->next=NULL;
		head->vid=v;
	}
	else
	{
		temp=head;
		while(temp->next!=NULL)
		{
			temp=temp->next;
		}
		newnode=(Queue*)malloc(sizeof(Queue));
		newnode->next=NULL;
		newnode->vid=v;
	}
	return;
}

int sum(int flag[],int n)
{
	int s=0;
	for(int i=0;i<n;i++)
	{
		s+=flag[i];
	}
	return s;
}

void Dijkstra(MGraph G,VtType ch)
{
	int* dis=(int*)malloc(sizeof(int)*G.vertexnum);
	int* flag=(int*)malloc(sizeof(int)*G.vertexnum);

	for(int i=0;i<G.vertexnum;i++)
	{
		if(G.vertex[i]==ch)
		{
			flag[i]=1;
			for(int j=0;j<G.vertexnum;j++)
			{
				dis[j]=G.arcs[i][j].adj;
			}
			break;
		}
	}

	while(sum(flag,G.vertexnum)!=G.vertexnum)
	{
		int i=0;
		int min=MAX_INT;
		int next=-1;
		for(i=0;i<G.vertexnum;i++)
		{
			if(flag[i]!=1)
			{
				if(dis[i]<min)
				{
					min=dis[i];
					next=i;
				}
			}
		}
		//新加入节点做标记
		flag[next]=1;

		//更新最近距离
/******************* 算法的核心所在 ******************/
		for(i=0;i<G.vertexnum;i++)
		{	
			if(dis[next]+G.arcs[next][i].adj<dis[i])
			{
				dis[i]=dis[next]+G.arcs[next][i].adj;
			}
		}
/*****************************************************/
	}

	printf("The min distance between node \'%c\' and others are:\n",ch);
	for(i=0;i<G.vertexnum;i++)
	{
		printf("%d\t",dis[i]);
	}
}

int main(void)
{
	MGraph G;

	CreateG(G);
	ShowAdjMat(G);
	
	Dijkstra(G,'1');

	printf("\n\n");
	system("pause");
	return 0;
}

Dijkstra算法求最短路径_第5张图片
 

你可能感兴趣的:(dijkstra算法,单源最短路径)