當前位置:首頁 » 操作系統 » 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-11-15 15:15:27 瀏覽:68
apache壓縮 發布:2024-11-15 15:11:54 瀏覽:245
java比較三個數 發布:2024-11-15 15:08:39 瀏覽:835
fml加密 發布:2024-11-15 15:05:56 瀏覽:883
存儲上市龍頭 發布:2024-11-15 14:52:14 瀏覽:38
我的世界伺服器怎麼重置教學 發布:2024-11-15 14:52:13 瀏覽:123
C語言tf 發布:2024-11-15 14:36:22 瀏覽:811
違反密碼法是什麼意思 發布:2024-11-15 14:36:20 瀏覽:921
androidmp3錄音 發布:2024-11-15 14:32:50 瀏覽:494
英朗自動擋哪個配置最好 發布:2024-11-15 14:27:44 瀏覽:254