图的最短路径算法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源代码

  • 2016年06月22日 17:42
  • 489KB
  • 下载

PAT 数据结构 06-图5. 旅游规划(25)Dijkstra最短路径算法

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便...

Dijkstra最短路径算法

  • 2007年11月08日 22:42
  • 3KB
  • 下载

Dijkstra 最短路径算法详解 无向图

对于最短路径问题,这里介绍一种O(N^2)的求解方法。 对于求最短路径的问题一般都会给出一幅图,或者边与边的关系。如上图。假设我们起点是A,我们要求到F的最短距离,我们会怎么做? 首先,因为A...

有向加权图的最短路径算法-Dijkstra

1 图的数据结构如下 4 5 0.35 5 4 0.35 4 7 0.37 5 7 0.28 7 5 0.28 5 1 0.32 0 4 0.38 0 2 0.26 7 3 0.39...

图的最短路径算法(Dijkstra,Floyd)的实现

从某个源点到其余各顶点的最短路径迪杰特斯拉算法Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点...

POJ 1847 Tram(Dijkstra单源有向图最短路径算法)

//Accepted 212 KB 0 ms C++ 1096 B 2013-02-27 19:42:55 /* Sample Input 3 2 1 2 2 3 2 3 1 2 1 2 Sampl...

有向图的无权图最短路径算法与带权图的Dijkstra算法

最短路径算法是图论中的常见问题,在实际中有着较为广泛的应用,比如查找从一个地方到另一个地方的最快方式。问题可以概括为,对于某个输入顶点s,给出s到所有其它顶点的最短路径。水平有限,暂时先对这个问题的求...
  • lhf2112
  • lhf2112
  • 2017年04月20日 18:48
  • 380

Dijkstra(迪杰斯特拉)最短路径算法之matlab实现(修正+验证)

最近需要用最短路径算法,很久没写了,很是生疏了,好歹是实现了基本功能了,至于性能什么的暂时也顾不上这么多了,先记录下,以备后用。 (当网络规模达到一定数量的时候,发现写的这个算法有问题,调试了2天,...
  • hainan89
  • hainan89
  • 2014年03月25日 16:04
  • 10236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的最短路径算法Dijkstra算法
举报原因:
原因补充:

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