当前位置:首页 » 操作系统 » dijkstra最短路径算法

dijkstra最短路径算法

发布时间: 2022-03-14 11:44:39

Ⅰ 用迪杰斯特拉算法计算最短路径

给定一个有向图,求v1到其他各节点的最短路径长度,以及最短路径。

要求:对dijkstra算法进行补充,使新算法在找出这些最短路径长度的同时,也能求出路径上的节点序列。

输入:一个有向带权图

这里写图片描述

输出的基本形式如下:

这里写图片描述

Ⅱ 运筹学用dijkstra算法求最短路径

就是通过广度搜索遍历当前节点和子节点的关系,然后再依次递归。
我给你开个头啊:
首先设首节点为1,那么子节点是2,3,4,那么我分别遍历
1-2 = 4
1-3 = 5
1-4 = 2
全部遍历完后我在从下面的第一个子节点开始遍历,
1(-2)-5 = 11
1(-2)-3 = 10 和1-3 = 5 对比 5<10 那么 1-3 = 5

1(-3)-2 = 11 和1-2 = 4进行对比 4<11 那么1-2 = 4
1(-3)-6 = 14
1(-3)-4 = 6 和 1-4 = 2进行对比 2< 6 那么 1-4 =2

1(-4)-3 = 3 和 1-3=5 进行对比 5 > 3 那么 1-3 = 3
.......................
依次遍历完整个图

最开始设1 到其他点的路径为无限大,
然后依次遍历,if( ( 1到当前点的路径 + 当前点到某子节点的路径) < (1 到该子节点的路径) )
1到该子节点的路径 = 1到当前点的路径 + 当前点到该子节点的路径)

Ⅲ Dijkstra最短路径算法 求助

1. 可以取第一个最小的或者取最后一个最小的
2. 这个取的先后对最终的结果没有影响

Ⅳ 求!Dijkstra算法计算两点之间最短路径的过程, 万分感谢啊。

假设Mdis[v]表示从原点到节点V的最短路径长度,通过以下算法确定从原点出发的单源最短路径。

1、选择一个还未扩展过的Mdis值最小的节点V*
2、通过节点V*所连接的每一条边执行松弛操作,i.e. mdis[k] = min{mdis[k], mdis[v] + cost<v, k>}
3、标记节点V为已扩展过,重复第一步直到所有节点都扩展过。

以上算法的时间复杂度为O(n^2),可以通过二叉堆优化到O(mlogn)

Ⅳ 求出最短路径,要过程,用Dijkstra算法。。。

从v1开始遍历
v2 = 2;
v3 = 5;
v2较小所以跳到v2
v3 = 4;

v4 = 6;
v5 = 8;
v3较小所以跳到v3
v4 = 5;
v6 = 7;
v4较小所以跳到v4
v6 = 6;
v7 = 9;
v6较小所以跳到v6
v7 = 8;

所以最后结果v1 -> v7最短路径为v1->v2->v3->v4->v6->v7,最短路径长度为8

Ⅵ Dijkstra算法算最短路径

////////////////////////////////////////////////////////////
// Graph.h
#pragma once

#define maxPoint 100

class CGraph
{
public:
CGraph(void);
~CGraph(void);

bool SetGraph( double g[maxPoint][maxPoint] , int startPoint , int size );
bool Dijkstra();
void Display();
int GetStartPoint();
double GetBestWay( int dest , int path[] , int &pathLen );
private:
//标志当前图是否已经求解
bool solved;
//当前图布局
double graph[maxPoint][maxPoint];
//地图大小
int size;
//起点
int startPoint;
//当前图的解
double dist[maxPoint];
int prev[maxPoint];
};

////////////////////////////////////////////////////////////
// Graph.cpp
#include 'StdAfx.h'
#include '.\graph.h'

CGraph::CGraph(void)
{
for( int i = 0 ; i < maxPoint ; i++ )
{
for( int j = 0 ; j < maxPoint ; j++ )
graph[i][j] = -1;
}
startPoint = -1;
size = -1;
//当前图还没有求解
solved = false;
}

CGraph::~CGraph(void)
{
}
//
//
bool CGraph::SetGraph( double g[maxPoint][maxPoint] , int startPoint , int size )
{
for( int i = 0 ; i < size ; i++ )
{
for( int j = 0 ; j < size ; j++ )
graph[i][j] = g[i][j];
}
this->startPoint = startPoint;
this->size = size;
solved = false;

Dijkstra();
return true;
}
//
//
bool CGraph::Dijkstra()
{
bool s[maxPoint];
for( int j = 0 ; j < size ; j++ )
{
dist[j] = graph[startPoint][j];
s[j] = false;
//dist[i]<0,表示没有路径连接 结点startPoint 与 结点j
if( dist[j] < 0 )
prev[j] = 0;
else
prev[j] = startPoint;
}
//从起点出发
dist[startPoint] = 0;
s[startPoint] = true;
for( int i = 0 ; i < size ; i++ )
{
double temp;
int u = startPoint;
bool flag = false;
for( int j = 0 ; j < size ; j++ )
{
if( !s[j] )
{
//如果不是第一次比较,temp u,都已经赋值,则
if( flag )
{
if( dist[j] > 0 && dist[j] < temp )
{
u = j;
temp = dist[j];
}
}
else
{
u = j;
temp = dist[j];
flag = true;
}
}
}
s[u] = true;
for( int j = 0 ; j < size ; j++ )
{
if( !s[j] && graph[u][j] > 0 )
{
double newDist = dist[u] + graph[u][j];
if( dist[j] < 0 || newDist < dist[j] )
{
dist[j] = newDist;
prev[j] = u;
}
}
}
}
//标记当前问题已经解决
solved = true;
return true;
}
//
//
void CGraph::Display()
{
printf( '当前地图的邻接矩阵\n' );
for( int i = 0 ; i < size ; i++ )
{
for( int j = 0 ; j < size ; j++ )
{
printf( '%5.f' , graph[i][j] );
}
printf( '\n' );
}
}
//
//
double CGraph::GetBestWay( int dest , int path[] , int &pathLen )
{
int p = dest;
int theway[maxPoint];
int len = 0;
while( p != startPoint )
{
theway[len] = p;
p = prev[p];
len++;
}
theway[len] = startPoint;
len++;
for( int i = 0 , j = len - 1 ; i < len ; i++ , j-- )
path[i] = theway[j];
pathLen = len;
return dist[dest];
}
//
//
int CGraph::GetStartPoint()
{
return startPoint;
}
//

////////////////////////////////////////////////////////////
// Dijkstra.cpp : 定义控制台应用程序的入口点。
//

#include 'stdafx.h'
#include 'conio.h'
#include 'Graph.h'

int _tmain(int argc, _TCHAR* argv[])
{
double graph[][maxPoint] =
{
{ 1 , 10 , -1 , 30 , 100 } ,
{ -1 , 0 , 50 , -1 , -1 } ,
{ -1 , -1 , 0 , -1 , 10 } ,
{ -1 , -1 , 20 , 0 , 60 } ,
{ -1 , -1 , -1 , -1 , -1 }
};
int size = 5;
int start = 0;
int dest = 1;
int pathlen;
int path[maxPoint];
double dist;

CGraph g;
g.SetGraph( graph , start , size );
g.Display();
printf( '----------------------------------------\n' );
for( dest = 0 ; dest < size ; dest++ )
{
dist = g.GetBestWay( dest , path , pathlen );

printf( '从 %d 到 %d 的最短路径长 %.f\n' , g.GetStartPoint() , dest , dist );
printf( '所经结点为:\n' );
for( int i = 0 ; i < pathlen ; i++ )
printf( '%3d' , path[i] );
printf( '\n----------------------------------------\n' );
}
getch();
return 0;
}

////////////////////////////////////////////////////////////
// 程序说明:
// 本程序在 VC++.NET 2003 上调试通过
// 首先建立 Win32控制台应用程序,工程名为 Dijkstra
// 工程设置默认
// 添加 一般C++类 CGraph
// 填写以上内容

Ⅶ 最短路径(Dijkstra算法)

0<-->2 = 667;
0<-->5 = 689;
0<-->9 = 1160;
0<-->13 = 1046;
1<-->13 = 242;
2<-->3 = 3036;
3<-->11 = 1892;
4<-->8 = 1180;
4<-->9 = 303;
4<-->14 = 825;
5<-->6 = 898;
5<-->9 = 695;
5<-->10 = 511;
6<-->7 = 707;
6<-->12 = 1419;
6<-->14 = 482;
7<-->8 = 1588;
10<-->11 = 676;
10<-->12 = 1346;
不是已经有答案了吗?还问什么呢

Ⅷ 数据结构 dijkstra算法 最短路径

你这个算法到这步,还没结束。
因为S=【1,2,4】,U=【3】。下面应该把【3】,加入到S中。进行路径的判断。
3加入进来,发现1-》2-》4大于1-》3-》4。所以1-》4的距离会重新算。

Ⅸ 迪杰斯特拉算法求最短路径题怎么做

最早的路径题,这个在做的时候,你可以通过练习一个函数关系式就能够进行,把它简单的测量出来的还是比较简单的。

热点内容
为什么自己开的服务器总是没有人来 发布:2024-09-25 09:28:37 浏览:554
crv混动版哪个配置性价比高2019 发布:2024-09-25 09:22:53 浏览:150
我的世界服务器关闭怎么进去 发布:2024-09-25 09:22:05 浏览:668
android开发的简历 发布:2024-09-25 09:08:41 浏览:244
密码盒的密码怎么改 发布:2024-09-25 08:51:46 浏览:868
win10如何应用加密 发布:2024-09-25 08:30:41 浏览:775
取余sql 发布:2024-09-25 08:29:10 浏览:448
弹簧压缩长度 发布:2024-09-25 08:25:18 浏览:403
伸臂梁的纵筋如何配置 发布:2024-09-25 08:25:10 浏览:812
验光换算法 发布:2024-09-25 08:24:07 浏览:289