#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h> #pragma warning(disable:4996) #define MAX_NAME 10
#define MAX_VERTEX_NUM 26 typedef char VertexType[MAX_NAME];
typedef unsigned int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接距阵 struct MGraph//定义网
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum, arcnum;
}; int LocateVex( MGraph& G, VertexType u ) //定位
{
register int i; for ( i = ; i < G.vexnum; ++ i )
{
if ( strcmp( u, G.vexs[i] ) == )
{
return i;
}
}
return -;
} void CreateDN( MGraph& G ) //建网
{
int i, j, k, w;
VertexType va, vb; printf( "请输入有向网G的顶点数和弧数(以空格作为间隔)\n" );
scanf( "%d %d", &G.vexnum, &G.arcnum ); memset( G.vexs, , sizeof( G.vexs ) );
printf( "请输入%d个顶点的值(<%d个字符):\n", G.vexnum, MAX_NAME );
for ( i = ; i < G.vexnum; ++ i )
{
scanf( "%s", G.vexs[i] );
} memset( G.arcs, 0xff, sizeof( G.arcs ) );
printf( "请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n", G.arcnum );
for ( k = ; k < G.arcnum; ++ k )
{
scanf( "%s%s%d%*c", va, vb, &w );
i = LocateVex( G, va );
j = LocateVex( G, vb );
G.arcs[i][j] = w;
}
} typedef unsigned int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef unsigned int ShortPathTable[MAX_VERTEX_NUM]; void ShortestPath_DIJ( MGraph& G, int v0, PathMatrix P, ShortPathTable D )
{
int v, w, i;
unsigned int min;
unsigned int final[MAX_VERTEX_NUM]; for ( v = ; v < G.vexnum; ++ v )
{
final[v] = ;
D[v] = G.arcs[v0][v]; memset( P[v], , sizeof( int ) * G.vexnum ); if ( D[v] < UINT_MAX )
{
P[v][v0] = P[v][v] = ;
}
} D[v0] = ;
final[v0] = ;
for ( i = ; i < G.vexnum; ++ i )
{
min = UINT_MAX;
for ( w = ; w < G.vexnum; ++ w )
{
if ( !final[w] && D[w] < min )
{
v = w;
min = D[w];
}
} final[v] = ; for ( w = ; w < G.vexnum; ++ w )
{
if ( !final[w] && min < UINT_MAX && G.arcs[v][w] < UINT_MAX && ( min + G.arcs[v][w] < D[w] ) )
{
D[w] = min + G.arcs[v][w];
memcpy( P[w], P[v], sizeof( int ) * G.vexnum );
P[w][w] = ;
}
}
}
} int main()
{
int i, j;
MGraph g;
PathMatrix p;
ShortPathTable d; CreateDN( g ); ShortestPath_DIJ( g, , p, d ); //以g中位置为0的顶点为源点,球其到其余各顶点的最短距离。存于d中 printf( "最短路径数组p[i][j]如下:\n" );
for ( i = ; i < g.vexnum; ++ i )
{
for ( j = ; j < g.vexnum; ++ j )
{
printf( "%2d", p[i][j] );
}
printf( "\n" );
} printf( "%s到各顶点的最短路径长度为:\n", g.vexs[] );
for ( i = ; i < g.vexnum; ++i )
{
if ( d[i] != UINT_MAX )
{
printf( "%s-%s:%d\n", g.vexs[], g.vexs[i], d[i] );
}
else
{
printf( "%s-%s:无路\n", g.vexs[], g.vexs[i] );
}
} system( "PAUSE" );
return ;
}

/*
请输入有向网G的顶点数和弧数(以空格作为间隔)
6 8
请输入6个顶点的值(<10个字符):
v1
v2
v3
v4
v5
v6
请输入8条弧的弧尾 弧头 权值(以空格作为间隔):
v1 v3 10
v1 v5 30
v1 v6 100
v2 v3 5
v3 v4 50
v4 v6 10
v5 v4 20
v5 v6 60
最短路径数组p[i][j]如下:
 0 0 0 0 0 0
 0 0 0 0 0 0
 1 0 1 0 0 0
 1 0 0 1 1 0
 1 0 0 0 1 0
 1 0 0 1 1 1
v1到各顶点的最短路径长度为:
v1-v2:无路
v1-v3:10
v1-v4:50
v1-v5:30
v1-v6:60
请按任意键继续. . .
*/

Dijkstra算法求最短路径的更多相关文章

  1. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  2. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

  3. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  4. 通俗易懂理解——dijkstra算法求最短路径

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...

  5. Dijkstra算法求最短路径 Java实现

    基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...

  6. Java实现Dijkstra算法求最短路径

    任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...

  7. Dijkstra算法求单源最短路径

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  8. js迪杰斯特拉算法求最短路径

    1.后台生成矩阵 名词解释和下图参考:https://blog.csdn.net/csdnxcn/article/details/80057574 double[,] arr = new double ...

  9. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

随机推荐

  1. sql_server_action

    ''' SELECT * FROM Info_Roles WHERE Flag=1 LIMIT 2; select top y * from 表 where 主键 not in(select top ...

  2. bzoj3332: 旧试题

    这题就是最大生成树. 把两个点之间的期望建边排序. 把相同的期望一起做,那么在这个做之前,这些有着相同期望的点两两肯定不连,否则就输出No了. 相同的做完之后,再次for一遍check一下有没有两两之 ...

  3. Java 数组的 12 个方法

    1.  声明一个数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c&q ...

  4. MSP430:输入捕获

    在做超声模块时用到 //捕获上升沿 void Capture_Pos(void) { P2SEL |= Echo; //选择P23作为捕捉的输入端子 Timer1_A //TA1CCTL1 |=CM_ ...

  5. 异常java.lang.UnsupportedOperationException: The application must supply JDBC connections

    转自:https://blog.csdn.net/q952420873/article/details/81355586 先上图  根据这个错误溯源 于是 我来到了数据库连接部分的代码 ,发现多了一个 ...

  6. servlet3.0 JQuary Ajax基本使用

    servlet3.0 没有web.xml文件,需要使用注解进行配置. js: $(document).ready(function(){ $("#btn").click(funct ...

  7. redis取经之路

    redis基本数据结构 Redis使用的是自己构建的简单动态字符串(SDS)[simple dynamic string,SDS]的抽象类型,并将SDS用做Rdis的默认字符串表示 redis> ...

  8. 这里有最全的C/C++入门到进阶书籍推荐,你需要嘛?

    编程是操作性很强的一门知识,看书少不了,但只有学习和实践相结合才能起到很好的效果,一种学习方法是看视频->看书->研究书中例子->自己做些东西->交流->看书. 研究经典 ...

  9. Akka源码分析-Event Bus

    akka中的EventBus其实是不常用,也最容易被忽略的一个组件. 但如果你深入Cluster的实现就会发现,这个东西其实还挺有用的,而且它是ActorSystem系统中所有事件消息的一个横切面,通 ...

  10. 程序员的幽默-献给所有Java程序员

    1. 一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!”程序员答:“加班.” 2. 某程序员对书法十分感兴趣,退休后决定在这方面有所建树.于是花重金购买了上等的文房四宝.一日,饭 ...