#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. vue cli webstorm

    贫富差距的产生 – 目光博客 http://eyehere.net/2017/1947/ https://github.com/vuejs/vue Vue 2.0 Hello World - JSFi ...

  2. Linux下的IPC-UNIX Domain Socket【转】

    本文转载自:http://blog.csdn.net/guxch/article/details/7041052 一. 概述 UNIX Domain Socket是在socket架构上发展起来的用于同 ...

  3. 44. Ext信息提示对话框

    转自:https://www.cnblogs.com/glsqh/p/5920500.html Ext.window.MessageBox是一个工具类,他继承自Ext.window.Windoe对象, ...

  4. PCB 加投率计算实现基本原理--K最近邻算法(KNN)

    PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...

  5. Tornado异步模式

    先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据.之前爬虫主要用Scrapy框架批量爬取一些页面数据,或者用Gevent调用目标站点的接口.偶然看到了Tornado,听说这个框架 ...

  6. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

  7. 不定长数组 Vector的 应用

    #include<cstdio> #include<vector> using namespace std; vector<int>a; int main() { ...

  8. ANDROID 开发之 SQLite

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...

  9. Linux下安装Wine 运行、卸载 windows程序

    资料 首页 https://www.winehq.org/ 安装 https://www.winehq.org/download/ 教程 https://www.winehq.org/document ...

  10. 元素属性的添加删除(原生js)

    添加属性 odiv.setAttribute("title","hello div!"); odiv.setAttribute("class" ...