1. 程式人生 > >Dijkstra演算法圖文詳解

Dijkstra演算法圖文詳解

Dijkstra演算法

Dijkstra演算法算是貪心思想實現的,首先把起點到所有點的距離存下來找個最短的,然後鬆弛一次再找出最短的,所謂的鬆弛操作就是,遍歷一遍看通過剛剛找到的距離最短的點作為中轉站會不會更近,如果更近了就更新距離,這樣把所有的點找遍之後就存下了起點到其他所有點的最短距離。

問題引入:

指定一個點(源點)到其餘各個頂點的最短路徑,也叫做“單源最短路徑”。例如求下圖中的1號頂點到2、3、4、5、6號頂點的最短路徑。

 

 

 

 

 下面我們來模擬一下:

 這就是Dijkstra演算法的基本思路:

接下來是程式碼:

已經把幾個過程都封裝成了基本模組:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define Inf 0x3f3f3f3f

using namespace std;

int map[1005][1005];

int vis[1005],dis[1005];
int n,m;//n個點,m條邊

void Init ()
{
	memset(map,Inf,sizeof(map));
	for(int i=1;i<=n;i++)
	{
		map[i][i]=0;
	}
}

void Getmap()
{
	int u,v,w;
    for(int t=1;t<=m;t++)
	{
	  	scanf("%d%d%d",&u,&v,&w);
	  	if(map[u][v]>w)
		  {
		  map[u][v]=w;
		  map[v][u]=w;
	      }
	}	
	
}

void Dijkstra(int u)
{
	memset(vis,0,sizeof(vis));
	for(int t=1;t<=n;t++)
	{
		dis[t]=map[u][t];
	}
	vis[u]=1;
	for(int t=1;t<n;t++)
	{
		int minn=Inf,temp;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i]&&dis[i]<minn)
			{
				minn=dis[i];
				temp=i;
			}
		}
		vis[temp]=1;
		for(int i=1;i<=n;i++)
		{
			if(map[temp][i]+dis[temp]<dis[i])
			{
				dis[i]=map[temp][i]+dis[temp];
			}
		}
	}
	
}

int main()
{
	
	scanf("%d%d",&m,&n);
	Init();
	Getmap();
	Dijkstra(n);
	printf("%d\n",dis[1]);
	
	
	return 0;
}

相關推薦

Dijkstra演算法圖文

Dijkstra演算法 Dijkstra演算法算是貪心思想實現的,首先把起點到所有點的距離存下來找個最短的,然後鬆弛一次再找出最短的,所謂的鬆弛操作就是,遍歷一遍看通過剛剛找到的距離最短的點作為中轉站會不會更近,如果更近了就更新距離,這樣把所有的點找遍之後就存下了起點到

三消遊戲演算法圖文

之前小編查詢發的資料小編本人也不太理解,所以這裡又找了一個講的個很詳細的文章,整理過後發出來大家一起分享! 消除演算法圖文詳解 三消演算法首要實現的就是找到所有三個或三個以上的可消除物件,但直接找到這些物件是不太現實的,所以我們要將需求拆分。可不可以先獲取所

常用的八大排序演算法圖文

概述排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。    當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸併

最小生成樹圖文(Prim演算法

最小生成樹 就像幾個村莊都不相通, 要修路, 怎麼修, 這個花的錢最少, 這種最優選擇就是最小生成樹 設G = (V, E)是無向連通圖(V是結點集, E是邊集),相對於村莊例子,V就是那些村莊的集合,E就是村莊之間路的集合

堆排序演算法圖文

堆排序演算法的圖文詳解 建立初始化堆 堆排序 堆排序過程主要由三個步驟組成: 構建大頂堆/小頂堆 構建初始化堆 排序 貫穿整個堆排序過程的一個重要演算法就是對堆進行調整。下面我們按照上面三個步

最短路演算法Dijkstra和Flody

最短路徑 在一個無權的圖中,若從一個頂點到另一個頂點存在著一條路徑,則稱該路徑長度為該路徑上所經過的邊的數目,它等於該路徑上的頂點數減1。由於從一個頂點到另一個頂點可能存在著多條路徑,每條路徑上所經過的邊數可能不同,即路徑長度不同,把路徑長度最短(即經過的邊數最少)的那條路

資料結構與演算法—佇列圖文

前言 棧和佇列是一對好兄弟,前面我們介紹過資料結構與演算法—棧詳解,那麼棧的機制相對簡單,後入先出,就像進入一個狹小的山洞,山洞只有一個出口,只能後進先出(在外面的先出去)。而佇列就好比是一個隧道,後面的人跟著前面走,前面人先出去(先入先出)。日常的排隊就是佇列運轉形式的一個描述! 所以佇列的核心理念

Android Studio使用教程圖文

識別 由於 group 之前 而是 ces doc java代碼 風格 Android Studio是一款非常專業的Android集成開發環境工具,那麽,Android Studio怎麽用呢?針對不知道Android Studio怎麽使用的朋友們,本文就為大家圖文詳細介紹A

LNMP編譯安裝之nginx安裝--圖文

star bin software tcp firewall onf nload b- 編譯安裝 LNMP編譯安裝之nginx安裝--圖文詳解 1、前言 本次安裝采用源碼安裝,主要資源包從官網下載,次要依賴則使用yum進行安裝,本篇只涉及nginx的安裝,不涉及nginx

jumpserver-0.3.2 堡壘機環境搭建(圖文

其他 install yum mage -128 req isa 解決 qq密碼 下載安裝包:https://github.com/jumpserver/jumpserver.git 解壓 三、執行快速安裝腳本 cd /opt/jumpserver/install pip

Wireshark安裝使用及報文分析(圖文

p s 技術 cap cut .net 信息 display 過程 數據 Wireshark是世界上最流行的網絡分析工具。這個強大的工具可以捕捉網絡中的數據,並為用戶提供關於網絡和上層協議的各種信息。與很多其他網絡工具一樣,Wireshark也使用pcapnetwork l

圖文AO打印(端橋模式)

鏈接 javascrip 普通 pri 網上 設備 宋體 網絡 執行 一、概述 AO打印是英文Active-Online Print的簡稱,也稱主動在線打印。打印前支持AO通訊協議的AO打印機首先通過普通網絡與C-Lodop服務保持在線鏈接,網頁程序利用JavaS

大數據學習系列之五 ----- Hive整合HBase圖文

scala direct ont 增加 pac hadoop2 exe dfs- min 引言 在上一篇 大數據學習系列之四 ----- Hadoop+Hive環境搭建圖文詳解(單機) 和之前的大數據學習系列之二 ----- HBase環境搭建(單機) 中成功搭建了Hive

CSS屬性:背景屬性(圖文

顏色 開發 github上 屬性。 一起 有用 class -a 設計 本文最初發表於博客園,並在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 background系列屬性 常見背景屬性 CSS樣式中,常見的背

Microsoft Power BI Desktop概念學習系列之Microsoft Power BI Desktop的下載和安裝(圖文

-c gpo mic sof mage pos microsoft body 技術分享   不多說,直接上幹貨!   官網 https://powerbi.microsoft.com/zh-cn/downloads/

Fiddler Web Debugger是什麽?(圖文

詳情 頁面 web客戶端 機器 代理人 博客 有用 style 攻擊     不多說,直接上幹貨! 1、為什麽是Fiddler?   抓包工具有很多,小到最常用的web調試工具firebug,達到通用的強大的抓包工具

Fiddler Web Debugger的下載和安裝(圖文

下載安裝 get html lan href bug pro 人生苦短 所有       不多說,直接上幹貨!   Fiddler是一個http協議調試代理工具,它能夠記錄客戶端和服務器之間的所有 HTTP請求,可以針對特定的HTTP請

全網最詳細的跑python2.7時出現from mysql import connector ImportError: No module named mysql的問題解決辦法(圖文

領域 conda load 機器學習 同時 精華 center mod con     不多說,直接上幹貨! C:\Users\lenovo>pip install mysql-connector-python-rf==2.1.3 Col

SPSS學習系列之SPSS Modeler怎麽修改默認的內存大小(圖文

隨著 大數據 com 微信公眾 深度 內存配置 圖文 font png     不多說,直接上幹貨!  問題來源:         如果你的電腦內存配置比較低的話,會隨著數據量增加(尤其是大數據),帶不起的情況很有可能發生,會出現一些內存報

Disconf 學習系列之全網最詳細的最新穩定Disconf 搭建部署(基於Ubuntu14.04 / 16.04)(圖文

class 6.0 conf ubuntu14 穩定 div ubun 搭建 學習   不多說直接上幹貨! https://www.cnblogs.com/wuxiaofeng/p/6882596.html (ubuntu16.04) https