图的最短路径算法Dijkstra算法

原创 2015年07月06日 19:59:34
#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);//输出邻接矩阵  
  
/************************************************************************   
函数名称:CreateMatrixGraph   
函数功能:创建邻接矩阵图 
函数参数: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;  
    }  
}  
/************************************************************************   
函数名称:OutMatrix   
函数功能:输出邻接矩阵 
函数参数:G是定义的图结构的指针 
函数返回:无  
************************************************************************/  
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");     
}  

/************************************************************************   
函数名称:Dijkstra   
函数功能:求顶点1到其它顶点的最短路径
函数参数:图G 
函数返回:0表示成功 
************************************************************************/ 
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]);
	}
}
/************************************************************************   
函数名称:main   
函数功能:测试图 
函数参数:无 
函数返回:0表示成功 
************************************************************************/  
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算法和Floyd算法。 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用...

最短路径 Dijkstra算法

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

最短路径(Dijkstra算法)

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

Dijkstra最短路径算法

1  最短路径算法 在日常生活中,我们如果需要常常往返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算法(最短路径)

基本思想 每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。 基本歩骤 将所有顶点分为两部分:已知最短路径的顶点集合P和未知最短路...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)