国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)--迪杰斯特拉(Dijkstra)算法

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)--迪杰斯特拉(Dijkstra)算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

生活封鎖了我們,只要我們的心不死,生活便永遠(yuǎn)不是一汪死水,而我們,依然會(huì)綻放最美的姿態(tài)。

什么是迪杰斯特拉算法??

算法來(lái)歷

戴克斯特拉算法(英語(yǔ):Dijkstra’s algorithm),又稱迪杰斯特拉算法、Dijkstra算法,是由荷蘭計(jì)算機(jī)科學(xué)家艾茲赫爾·戴克斯特拉在1956年發(fā)現(xiàn)的算法,并于3年后在期刊上發(fā)表。戴克斯特拉算法使用類似廣度優(yōu)先搜索的方法解決賦權(quán)圖的單源最短路徑問(wèn)題。

該算法存在很多變體:戴克斯特拉的原始版本僅適用于找到兩個(gè)頂點(diǎn)之間的最短路徑,后來(lái)更常見(jiàn)的變體固定了一個(gè)頂點(diǎn)作為源結(jié)點(diǎn)然后找到該頂點(diǎn)到圖中所有其它結(jié)點(diǎn)的最短路徑,產(chǎn)生一個(gè)最短路徑樹(shù)。

算法的用途

該算法解決了圖 上帶權(quán)的單源最短路徑問(wèn)題。具體來(lái)說(shuō),戴克斯特拉算法設(shè)置了一頂點(diǎn)集合S,在集合S中所有的頂點(diǎn)與源點(diǎn)s之間的最終最短路徑權(quán)值均已確定。該算法常用于路由算法或者作為其他圖算法的一個(gè)子模塊。舉例來(lái)說(shuō),如果圖中的頂點(diǎn)表示城市,而邊上的權(quán)重表示城市間開(kāi)車行經(jīng)的距離,該算法可以用來(lái)找到兩個(gè)城市之間的最短路徑。

迪杰斯特拉算法的理論??

首先舉出圖例1,在圖中選擇下標(biāo)為0的V0點(diǎn)開(kāi)始遍歷。
迪杰斯特拉,數(shù)據(jù)結(jié)構(gòu)與算法,1024程序員節(jié)
不難看出,從v0開(kāi)始選擇最短路徑,即V0->V1,再進(jìn)行選擇遍歷,即V0->V1->V2,如圖例2所示。
迪杰斯特拉,數(shù)據(jù)結(jié)構(gòu)與算法,1024程序員節(jié)
如此反復(fù),就可以得到源點(diǎn)V0至終點(diǎn)V8的最短權(quán)值路徑。如圖例3所示。
迪杰斯特拉,數(shù)據(jù)結(jié)構(gòu)與算法,1024程序員節(jié)

迪杰斯特拉算法實(shí)現(xiàn)??

首先,我們需要知道,迪杰斯特拉算法是基于鄰接矩陣實(shí)現(xiàn)的,如過(guò)對(duì)于鄰接矩陣還有些不熟悉的同學(xué)可以復(fù)習(xí)一下點(diǎn)我復(fù)習(xí)鄰接矩陣
之前的圖結(jié)構(gòu),轉(zhuǎn)化成鄰接矩陣如圖例4所示。
迪杰斯特拉,數(shù)據(jù)結(jié)構(gòu)與算法,1024程序員節(jié)

宏定義

#include <stdio.h>
#include <stdlib.h>
#define INFINITY 65535
#define MAXVEX 9
typedef int Patharc[MAXVEX];       //用于存儲(chǔ)最短路徑下標(biāo)的數(shù)組
typedef int ShortPathTable[MAXVEX];//用于存儲(chǔ)最短路徑的權(quán)值和
typedef char VertexType;           //頂點(diǎn)類型
typedef int EdgeType;              //邊上的權(quán)值

前提函數(shù)實(shí)現(xiàn)

typedef struct
{
	VertexType vexs[MAXVEX];//頂點(diǎn)表
	EdgeType arc[MAXVEX][MAXVEX];//鄰接矩陣
	int numVertexes, numEdges;//頂點(diǎn)數(shù)以及邊數(shù)
}MGraph;

void CreateMGraph(MGraph* G)
{
	int  k, w;
	char i, j;
	printf("輸入頂點(diǎn)數(shù)和邊數(shù):\n");
	scanf("%d%d", &G->numVertexes, &G->numEdges);
	printf("請(qǐng)輸入頂點(diǎn)信息:");
	getchar();
	for (i = 0; i < G->numVertexes; i++)//分別輸入頂點(diǎn)信息
	{
		scanf("%c", &G->vexs[i]);
		getchar();
	}
	for (i = 0; i < G->numVertexes; i++)
		for (j = 0; j < G->numVertexes; j++)
			G->arc[i][j] = INFINITY;    //初始化所有點(diǎn)之間權(quán)無(wú)窮大

	for (k = 0; k < G->numEdges; k++)
	{
		printf("輸入邊(vi,vj)上的下標(biāo)i,下標(biāo)j和權(quán)w:\n");
		scanf("%d%d%d", &i, &j, &w);
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];//無(wú)向圖,矩陣對(duì)稱
	}
}

迪杰斯特拉算法

void ShortestPath_Dijkstra(MGraph G, int V0, Patharc* P, ShortPathTable* D)
{
	int v, w, k, min;
	int final[MAXVEX];   //final[w]=1表示求得頂點(diǎn)V0至Vw的最短路徑
	for (v = 0; v < G.numVertexes; v++)
	{
		final[v] = 0;            //全部頂點(diǎn)初始化為未知最短路徑狀態(tài)
		(*D)[v] = G.arc[V0][v];  //將與V0點(diǎn)有連線的頂點(diǎn)加上權(quán)值
		(*P)[v] = 0;             //初始化路徑數(shù)組P為0
	}

	(*D)[V0] = 0;                //v0至v0的路徑為0
	final[V0] = 1;               //v0至v0不需要求路徑

	//開(kāi)始主循環(huán),每次求得v0到某個(gè)v頂點(diǎn)的最短路徑
	for (v = 1; v < G.numVertexes; v++)
	{
		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				k = w;
				min = (*D)[w];    //w頂點(diǎn)距離v0更近
			}
		}

		final[k] = 1;             //表示k下標(biāo)的頂點(diǎn)已經(jīng)在路徑中
		for (w = 0; w < G.numVertexes; w++)//檢查一遍
		{
			if (!final[w] && (min+G.arc[k][w]<(*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];
				(*P)[w] = k;
			}
		}
	}
}

主函數(shù)實(shí)現(xiàn)

int main()
{
	MGraph G;
	CreateMGraph(&G);
    Patharc P;
	ShortPathTable D;
	ShortestPath_Dijkstra(G,0,&P,&D);
}

調(diào)試結(jié)果

1) D數(shù)組中每個(gè)下標(biāo)的的數(shù)據(jù)對(duì)應(yīng)到達(dá)此下標(biāo)頂點(diǎn)的最短權(quán)值。

2) final數(shù)組表示數(shù)組中的各點(diǎn)是否進(jìn)入最短路徑。

3)P數(shù)組表示數(shù)組中的各點(diǎn)的前一個(gè)頂點(diǎn)
迪杰斯特拉,數(shù)據(jù)結(jié)構(gòu)與算法,1024程序員節(jié)

代碼解析

定義一個(gè)用于存儲(chǔ)最短路徑下標(biāo)的數(shù)組

typedef int Patharc[MAXVEX]; 
 Patharc P;

定義一個(gè)用于存儲(chǔ)最短權(quán)值和的數(shù)組

typedef int ShortPathTable[MAXVEX];
ShortPathTable D;

定義一個(gè)判斷一點(diǎn)是否進(jìn)入最短路徑的數(shù)組,1表示已進(jìn)入,0表示未進(jìn)入。

int final[MAXVEX]; 

對(duì)各項(xiàng)數(shù)據(jù)進(jìn)行初始化,以便進(jìn)行遍歷。

for (v = 0; v < G.numVertexes; v++)
	{
		final[v] = 0;            //全部頂點(diǎn)初始化為未知最短路徑狀態(tài)
		(*D)[v] = G.arc[V0][v];  //將與V0點(diǎn)有連線的頂點(diǎn)加上權(quán)值
		(*P)[v] = 0;             //初始化路徑數(shù)組P為0
	}
	(*D)[V0] = 0;                //v0至v0的路徑為0
	final[V0] = 1;               //v0至v0不需要求路徑

進(jìn)行第一遍遍歷,注意這里的(*D)[]是之前初始化的第一行數(shù)組數(shù)據(jù)。

		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				k = w;
				min = (*D)[w];    //w頂點(diǎn)距離v0更近
			}
		}

		final[k] = 1;             //表示k下標(biāo)的頂點(diǎn)已經(jīng)在路徑中

這可以進(jìn)行第一遍遍歷,但是再往下走就不可以了,所以有了下列代碼補(bǔ)全。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766570.html

for (w = 0; w < G.numVertexes; w++)//檢查一遍
		{
			if (!final[w] && (min+G.arc[k][w]<(*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];
				(*P)[w] = k;
			}
		}

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)--迪杰斯特拉(Dijkstra)算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】最小生成樹(shù)(Prim算法,普里姆算法,普利姆)、最短路徑(Dijkstra算法,迪杰斯特拉算法,單源最短路徑)

    【數(shù)據(jù)結(jié)構(gòu)】最小生成樹(shù)(Prim算法,普里姆算法,普利姆)、最短路徑(Dijkstra算法,迪杰斯特拉算法,單源最短路徑)

    問(wèn)題解答 (1)最小生成樹(shù)(Minimal Spanning Tree)的定義 生成樹(shù)的代價(jià) :設(shè) G ( V , E ) G(V,E) G ( V , E ) 是一個(gè)無(wú)向連通網(wǎng)圖,生成樹(shù)上 各邊的權(quán)值之和 稱為 生成樹(shù)的代價(jià) 。 最小生成樹(shù) :在圖 G G G 所有生成樹(shù)中, 代價(jià)最小的生成樹(shù) 為 最小生成樹(shù) 。 (2)最小生成樹(shù)(MST)的性

    2024年02月11日
    瀏覽(53)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)記錄——圖-最短路徑問(wèn)題(無(wú)權(quán)圖單源最短路徑算法、有權(quán)圖單源最短路徑算法、多源最短路徑算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)記錄——圖-最短路徑問(wèn)題(無(wú)權(quán)圖單源最短路徑算法、有權(quán)圖單源最短路徑算法、多源最短路徑算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目錄 問(wèn)題分類? 無(wú)權(quán)圖單源最短路徑算法 思路 偽代碼 時(shí)間復(fù)雜度 代碼實(shí)現(xiàn)(C語(yǔ)言) 有權(quán)圖單源最短路徑算法 Dijkstra(迪杰斯特拉)算法 偽代碼? 時(shí)間復(fù)雜度? 代碼實(shí)現(xiàn)(C語(yǔ)言) 多源最短路徑算法 兩種方法 Floyd算法 代碼實(shí)現(xiàn)(C語(yǔ)言) 最短路徑問(wèn)題的抽象 在網(wǎng)絡(luò)中,求

    2024年02月08日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】迪杰斯特拉算法

    【數(shù)據(jù)結(jié)構(gòu)與算法】迪杰斯特拉算法

    介紹 迪杰斯特拉(Dijkstra)算法是 典型最短路徑算法 ,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑。它的主要特點(diǎn)是以中心向外層層擴(kuò)展(廣度優(yōu)先搜索思想),直到擴(kuò)展到終點(diǎn)為止。 算法過(guò)程 設(shè)置出發(fā)頂點(diǎn)為 v,頂點(diǎn)集合 V{v1,v2,v3…vi},v 到 V 中各頂點(diǎn)的距離構(gòu)成距離集合

    2024年02月11日
    瀏覽(49)
  • Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是廣度優(yōu)先搜索(BFS) 貪心策略。 是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,節(jié)點(diǎn)邊是不各自不同的權(quán)重,但都必須是正數(shù) 如果是負(fù)數(shù),則需要 Bellman-Ford 算法 如果想求任意兩點(diǎn)之間的距離,就需要用 Floyd 算法 求節(jié)點(diǎn)0 - 4 的最短路徑 每次從

    2024年04月12日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】最短路徑算法實(shí)現(xiàn)(Dijkstra(迪克斯特拉),F(xiàn)loydWarshall(弗洛伊德) )

    【數(shù)據(jù)結(jié)構(gòu)】最短路徑算法實(shí)現(xiàn)(Dijkstra(迪克斯特拉),F(xiàn)loydWarshall(弗洛伊德) )

    最短路徑問(wèn)題 :從在帶權(quán)有向圖G中的某一頂點(diǎn)出發(fā),找出一條通往另一頂點(diǎn)的最短路徑,最短也就是沿路徑各邊的權(quán)值總和達(dá)到最小。 單源最短路徑問(wèn)題:給定一個(gè)圖G = ( V , E ) G=(V,E)G=(V,E),求源結(jié)點(diǎn)s ∈ V s∈Vs∈V到圖 中每個(gè)結(jié)點(diǎn)v ∈ V v∈Vv∈V的最短路徑 針對(duì)一個(gè)帶權(quán)

    2024年02月04日
    瀏覽(31)
  • dijkstra迪杰斯特拉算法(鄰接表法)

    dijkstra迪杰斯特拉算法(鄰接表法)

    算法簡(jiǎn)易過(guò)程: 求單源有向圖最短路徑 使用 鄰接表法 來(lái)存儲(chǔ)頂點(diǎn)和邊,錄入 有向圖 。 (當(dāng)然也可以無(wú)向圖,不過(guò)錄入時(shí)要錄入兩次,比如 a b 3? ? ? ? b a 3) ?代碼如下: 測(cè)試如下: ?

    2024年02月07日
    瀏覽(33)
  • (迪杰斯特拉)Dijkstra算法及其優(yōu)化(C++)

    (迪杰斯特拉)Dijkstra算法及其優(yōu)化(C++)

    題目描述 給定一個(gè) n n n 個(gè)點(diǎn) m m m 條邊的有向圖,圖中可能存在重邊和自環(huán),所有邊權(quán)均為非負(fù)值。 請(qǐng)你求出 1 1 1 號(hào)點(diǎn)到 n n n 號(hào)點(diǎn)的最短距離,如果無(wú)法從 1 1 1 號(hào)點(diǎn)走到 n n n 號(hào)點(diǎn),則輸出 ? 1 ?1 ? 1 。 輸入格式 第一行包含整數(shù) n n n 和 m m m 。 接下來(lái) m m m 行每行包含三

    2023年04月09日
    瀏覽(32)
  • C語(yǔ)言 最短路徑 迪杰斯特拉(Dijkstra)算法

    C語(yǔ)言 最短路徑 迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有權(quán)圖中單源最短路徑問(wèn)題。迪杰斯特拉算法主要特點(diǎn)是從起始點(diǎn)開(kāi)始,采用貪心算法的策略,每次遍歷到始點(diǎn)距離最

    2024年02月03日
    瀏覽(31)
  • 堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

    堆優(yōu)化版迪杰斯特拉(Dijkstra)算法簡(jiǎn)單分析

    優(yōu)化原理: 上面的樸素版迪杰斯特拉算法主要缺陷是,每當(dāng)找到一個(gè)最短路徑,如果需要找下一個(gè)最短路徑,就需要在完成松弛操作之后,遍歷dist數(shù)組,尋找其中的最小值。遍歷dist數(shù)組的時(shí)間復(fù)雜度為O(n)。(dist數(shù)組儲(chǔ)存源點(diǎn)到各個(gè)點(diǎn)的當(dāng)前最短距離) 如果圖的邊數(shù)為n*(

    2023年04月08日
    瀏覽(24)
  • 大二數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)(迪杰斯特拉最短路徑)

    大二數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)(迪杰斯特拉最短路徑)

    大二數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn),有詳細(xì)批注,代碼可以直接運(yùn)行,希望可以給大家提供到幫助。 實(shí)驗(yàn)?zāi)康?掌握?qǐng)D的鄰接矩陣的存儲(chǔ)定義。 掌握?qǐng)D的最短路徑(Dijsktra)算法的實(shí)現(xiàn)。 實(shí)驗(yàn)內(nèi)容 設(shè)計(jì)校園平面圖,所含景點(diǎn)不少于8個(gè)。以圖中頂點(diǎn)表示學(xué)校內(nèi)各景點(diǎn),存放景點(diǎn)的名稱、景點(diǎn)

    2024年02月12日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包