用Dijkstra算法求最短路径

问题描述:交通网络中常常会提出这样的问题:两地之间是否有路相通?在有多条通路的情况下,哪一条最短?以上问题就是带权图中求最短路径的问题。
基本要求:
一 用DIJKSTRA算法求最短路径,图中的顶点数N 不得少于10个,待输入的数据(边的关联顶点信息和权值)存储在预先立的文件中。
二 用户输入源点和目标点后,程序应输出源点到目标点的最短路径,并计算出途中所需时间或花费的交通费用。
最好以河北省具体的地图为准,参数最好要真实!
在线等!~ Q471347130 phone15081474660沧州

第1个回答  推荐于2018-04-05
#include <stdio.h>
#include <string.h>
#define MAX 20
int mincost(int V[], int D[], int n);
int main()
{
int C[MAX][MAX];
int D[MAX], V[MAX] = { 0 }; /*数组V用来表示每次计算加入集合V的点,1为加入了,0为还没有加入*/
int n, i, j, k, w, sum;
printf("请输入顶点个数:");
scanf("%d", &n);
printf("\n请输入建立后的临接矩阵(用n*n矩阵表示), 输入100000表示无穷大:\n");
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d", &C[i][j]);
}
}
V[1] = 1; /*1为源点*/
for(i = 1; i <= n; i++)
{
D[i] = C[1][i]; /*D置初值*/
}
for(i = 1; i <= n; i++)
{
/*从集合S(即没有经过计算的点)中选出一个点w(即V中值为0),使D[w]值最小*/
w = mincost(V, D, n);
V[w] = 1;
/*由于w的选定,S中的每个点(即V中值为0的点都要重新计算其到源点的最小值*/
for(k = 2; k <= n; k++)
{
if(V[k] == 0)
{
sum = D[w] + C[w][k];
if(sum < D[k])
{
D[k] = sum;
}
}
}
}
for(i = 2; i <= n; i++)
{
printf("D[%d] = %d\n", i, D[i]);
}
memset(V, 0, MAX * sizeof(int)); /*初始化*/
return 0;
}

int mincost(int V[], int D[], int n)
{
int temp = 10000000, i, w = 2;
for(i = 2;i <= n; i++)
{
if(V[i] == 0 && D[i] < temp)
{
temp = D[i];
w = i;
}
}
return w;
}

改成文件的就行了本回答被提问者和网友采纳

求最短路径的dijkstra算法
Dijkstra迪杰斯特拉是一种处理单源点的最短路径算法,就是说求从某一个节点到其他所有节点的最短路径就是Dijkstra。 资料拓展: 迪杰斯特拉算法(Dijkstra)是由荷兰数腔计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其薯纳衫余各顶点的最短路径算法,解决的是有权图中最短路径问题。

最短路径算法(Dijkstra)
Dijkstra算法是解决带有非负权值的最短路径问题的一种著名算法,它基于深度优先搜索和贪心策略。以下是应用Dijkstra算法解决一个有权图中的单源最短路径问题的情况。1. 初始化:从起点A开始,对所有其他节点,假设它们到A的距离为无穷大,只有A到自身的距离为0。将A点标记为已访问,并进行颜色标记,结果...

最短路径 - Dijkstra算法
1.选定A节点并初始化,如上述步骤3所示 2.执行上述 4、5两步骤,找出U集合中路径最短的节点D 加入S集合,并根据条件 if ( 'D 到 B,C,E 的距离' + 'AD 距离' < 'A 到 B,C,E 的距离' ) 来更新U集合 3.这时候 A->B, A->C 都为3,没关系。其实这时候他俩都是最短距离,如果...

利用Dijkstra算法求下图中从顶点1到其它各顶点间的最短路径,按下面表格...
v1到v4:8为最短路径;v1到v5:v1-> v2 -> v5 =10+6= 16;v1v3v5=7+9=16;v1v4v6v5=8+5+2=15; 15为最短路径;v1到v6:v1v2v3v6=10+2+9=21;v1v3v6=7+9=16;v1v4v6=8+5=13;13为最短路径;v1到v7:v1v2v5v7=10+6+20=36;v1v3v5v7=7+9+20=36;v1v3v6v7...

怎样用DIJKSTRA算法设计最短路径
此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。2)算法步骤:a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则...

Dijkstra算法解最短路问题
为了实现Dijkstra算法,可以编写一个简单的程序,使用诸如MATLAB这样的编程环境。程序通常会定义一个矩阵来存储各个顶点的最短路径估计值,并通过循环迭代更新这个矩阵,直到所有顶点的最短路径都被计算出来。在程序的最后,输出的结果就是从起点到所有其他顶点的最短路径及其对应的路径成本。理解Dijkstra算法的...

用dijkstra算法计算源点到个结点的最短路径...谢谢亲爱的朋友~ 详细...
Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj...

用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,并写出执行算 ...
Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到v的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到u的路径。这条路径的长度是d+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表...

最短路径算法(Dijkstra)
Dijkstra( 迪科斯特拉 )算法是用来解决单源最短路径的算法,要求路径权值非负数。该算法利用了深度优先搜索和贪心的算法。下面是一个有权图,求从A到各个节点的最短路径。第1步:从A点出发,判断每个点到A点的路径(如果该点不能直连A点则距离值为无穷大,如果该点能和A直连则是当前的权值),...

带条件的dijkstra最短路径问题
带条件的Dijkstra算法是在经典Dijkstra算法基础上,解决在保证经过节点最少前提下的最短路径问题。它在传统算法流程中增加了判断环节,以满足特定条件,如最小城市数到达、召集救援队最多等。以下是算法的直观描述:带条件的Dijkstra算法处理的是在图中找到两点之间最短路径,但同时需要考虑额外的约束。例如,...

相似回答