单源最短路径榜单世界第一,单源最短路径算法---Dijkstra

 2023-09-28 阅读 25 评论 0

摘要:Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负。 解题思路:   V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[

Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负。

解题思路:

  V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[i]表示)已经确定。算法反复选择具有最短路径估计的顶点u 属于 V-S(即未确定最短路径的点,程序中finish[i]=false的点),并将u加入到S中(用finish[i]=true表示),最后对u的所有输出边进行松弛。

单源最短路径榜单世界第一?程序实现:

     输入数据:

    

5 7

单源最短路径和多源最短路径、0 1 100

0 2 30

0 4 10

2 1 60

单源最短路径问题。2 3 60

3 1 10

4 3 50

 

/*************************************************************************> File Name: Dijkstra.cpp> Author: He Xingjie> Mail: gxmshxj@163.com> Created Time: 2014年06月07日 星期六 22时12分43秒> Description: ************************************************************************/
#include<iostream>
#include<cstdio>using namespace std;#define INF 99999//map矩阵记录路径图,dist[i]表示源点到节点
//i的最短路径,finish[i]表示节点i找到最短路径
//path[i]=j表示从源节点到i节点的最短路径要经过j
int map[100][100], dist[100], finish[100];
int path[100];void Dijkstra(int s, int n)
{
/**s为源点,n为节点的个数*当finish[i]=true时,dist[i]*为s到i的最短路径*假设S为已求得最短路径的终点集合*V为所有节点的集合*/int i, j, v, k;//初始化dist[i]for (i=1; i<n; i++){dist[i] = map[s][i];if (dist[i] < INF)path[i] = s;}//初始化源节点finish[s] = true;dist[s] = 0;for (i=1; i<n; i++)  //总共有n-1个节点
    {int min = INF;for (j=0; j<n; j++)      {//从V-S中(没有找到最短路径的集合)寻找离源节点//距离最近的点if (!finish[j] && dist[j] < min){v = j;min = dist[j];}}//找到最短路径finish[v] = true;    //把节点v加入到S中//松弛(Relax)for (k=0; k<n; k++){if (!finish[k] && map[v][k] != INF)if (dist[k] > dist[v] + map[v][k]){dist[k] = dist[v] + map[v][k];path[k] = v;}}}
}void PrintPath(int k)
{if (k == 0){printf("%d", k);return;}PrintPath(path[k]);printf("->%d", k);
}void PrintMap(int n)
{int i, j;//输出矩阵for (i=0; i<n; i++){for (j=0; j<n; j++){if (map[i][j] == INF)printf("INF ");elseprintf("%d  ", map[i][j]);}printf("\n");}
}int main()
{int n, m, i, j;freopen("input.txt", "r", stdin);cin>>n>>m;    //n是顶点数,m是边数//初始化for (i=0; i<n; i++){finish[i] = false;for (j=0; j<n; j++)map[i][j] = INF;}//输入for(int i=1; i<=m; i++){int i,j;cin>>i>>j;cin>>map[i][j];}/**PrintMap(n);*/Dijkstra(0, n);for (i=1; i<n; i++){printf("Path: ");PrintPath(i);printf("  Dist:%d\n", dist[i]);}return 0;
}

单源最短路径贪心算法, 

参考:

http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html   

http://blog.csdn.net/hnuzengchao/article/details/7534690

最短路径。转载于:https://www.cnblogs.com/Jason-Damon/p/3775936.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/102034.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息