#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. 安卓dex 文件结构简要说明

    #ifndef _DEX_FILE_HELPER_ #define _DEX_FILE_HELPER_ //此文件仅仅是起帮助作用,帮助不太了解DexFile结构的了解一下DexFile相关结构,想更 ...

  2. RatingBar android:isIndicator="true"

    有时候我们用RatingBar只须要显示不让它选择或改变,解决办法是设置属性 android:isIndicator="true" isIndicator的意思是:是否是指示器,如 ...

  3. C语言strdup()函数:复制字符串【转】

    本文转载自:http://c.biancheng.net/cpp/html/166.html 头文件:#include <string.h> 定义函数:char * strdup(cons ...

  4. 第三章、Tiny4412 U-BOOT移植三 时钟设置【转】

    本文转自:http://blog.csdn.net/eshing/article/details/37521789 这一章说明配置时钟频率基本原理 OK,接着说,这次先讲讲CPU的系统时钟.U-BOO ...

  5. [Codeforces Round495A] Sonya and Hotels

    [题目链接] https://codeforces.com/contest/1004/problem/A [算法] 直接按题意模拟即可 时间复杂度 :O(NlogN) [代码] #include< ...

  6. POJ2985 The k-th Largest Group treap

    POJ2985 比较简单的平衡树题目 树内不要添加容量为1的节点 否则会超时. #include<iostream> #include<cstdio> #include< ...

  7. Sublime Text 汉化插件

    https://blog.csdn.net/heyangyi_19940703/article/details/51869502 一.Sublime Text工具介绍: Sublime Text 是一 ...

  8. Redis学习和应用记录(1)--介绍和安装

    Redis是一个开源的分布式缓存框架,它也常被理解为数据结构服务器,因为它包含丰富的数据类型,如strings, hashes, lists, sets, sorted sets, bitmaps a ...

  9. Java中多个线程交替循环执行

    有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...

  10. RocketMQ(1)--helloworld

    双Master方式: 服务器环境 序号 IP 角色 模式 1 192.168.32.135 nameServer1,brokerServer1  Master1 2 192.168.32.136 na ...