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

Dijkstra算法求最短路

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

一.算法描述

Dijkstra算法求最短路

Dijkstra算法的流程如下:
1.初始化dist[1] = 0,其余節(jié)點(diǎn)的dist值為無(wú)窮大。
2.找出一個(gè)未被標(biāo)記的、dist[x]最小的節(jié)點(diǎn)x,然后標(biāo)記節(jié)點(diǎn)x。
3.掃描節(jié)點(diǎn)x的所有出邊(x,y,z),若dist[y] > dist[x] + z,則使用dist[x] + z更新dist[y]。
4.重復(fù)上述2~3兩個(gè)步驟,直到所有的節(jié)點(diǎn)都被標(biāo)記。

Dijkstra算法基于貪心思想,它只適用于所有邊的長(zhǎng)度都是非負(fù)整數(shù)的圖。當(dāng)邊長(zhǎng)都是負(fù)數(shù)時(shí),全局的最小值不可能在被其他節(jié)點(diǎn)更新,故在第一步中選出的節(jié)點(diǎn)x必然滿(mǎn)足:dist[x]已經(jīng)是起點(diǎn)到x的最短路徑。我們不斷選擇全局最小值進(jìn)行標(biāo)記和擴(kuò)展,最終得到起點(diǎn)1到每個(gè)節(jié)點(diǎn)的最短路徑長(zhǎng)度。

二.算法應(yīng)用

例:對(duì)于如下有向圖求1 號(hào)點(diǎn)到 4 號(hào)點(diǎn)的最短距離

Dijkstra算法求最短路
(1).初始狀態(tài)原點(diǎn)到1號(hào)的距離為0,因此dist[1] = 0
Dijkstra算法求最短路

(2).遍歷dist數(shù)組找到當(dāng)前距離原點(diǎn)最近的點(diǎn)i并將該點(diǎn)進(jìn)行標(biāo)記,用找到的點(diǎn)i更新i能到的所有點(diǎn)的距離j,如果 dist[j] 大于 dist[i] 加上 i -> j 的距離,即 dist[j] > dist[i] + w[i][j](w[i][j] 為 i -> j 的距離) ,則更新 dist[j] = dist[i] + w[i][j]
Dijkstra算法求最短路
(3).重復(fù)步驟(2),直到所有的點(diǎn)都被標(biāo)記為1
Dijkstra算法求最短路

Dijkstra算法求最短路
Dijkstra算法求最短路

三.代碼示例

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 510;
int g[N][N], dist[N];
int n, m;
bool st[N];

int dijkstra()
{
    dist[1] = 0;
    for(int i = 0; i < n; i++)
    {
        int t = -1;
        //找到未標(biāo)記節(jié)點(diǎn)中dist最小的
        for(int j = 1; j <= n; j++)
            if(!st[j] && (t == -1 || dist[j] < dist[t]))
                t = j;
      
        st[t] = true;
        //用全局最小的值點(diǎn)t更新其他點(diǎn)
        for(int j = 1; j <= n; j++)
            dist[j] = min(dist[j], dist[t] + g[t][j]);
    }
    
    if(dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

int main()
{
    memset(dist, 0x3f, sizeof dist);
    //構(gòu)建鄰接矩陣
    memset(g, 0x3f, sizeof g);
    cin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        g[x][y] = min(g[x][y], z);
    }
    //求單源最短路徑
    dijkstra();
   
    for(int i = 1; i <= n; i++) printf("%d\n", dist[i]);
    return 0;
}

四.算法改進(jìn)

Dijkstra算法的時(shí)間復(fù)雜度為O(n^2),主要的瓶頸在于第一步的尋找全局最小值的過(guò)程??梢杂枚娑眩–++ STL priority_queue)對(duì)dist數(shù)組進(jìn)行維護(hù),用O(longn)的時(shí)間獲取最小值并從堆中刪除。用O(longn)的時(shí)間執(zhí)行一條邊的擴(kuò)展和更新,最終可在O(mlongn)的時(shí)間內(nèi)實(shí)現(xiàn)Dijkstra算法。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-460869.html

堆優(yōu)化版的Dijkstra算法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>

#define x first
#define y second

using namespace std;

const int N = 2e5 + 10;

typedef pair<int, int> PII;

int n, m;
int h[N], e[N], ne[N], w[N], idx; //鄰接表
int dist[N];
bool st[N]; //標(biāo)記數(shù)組

//構(gòu)建鄰接表
void add(int a, int b,int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    //pair的第一維為當(dāng)前節(jié)點(diǎn)到原點(diǎn)的最短距離,第二維為節(jié)點(diǎn)編號(hào)
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({dist[1], 1});
    while(heap.size())
    {
        //取出堆頂
        auto k = heap.top();
        heap.pop();
        int ver = k.y, distance = k.x;
        if(st[ver]) continue;
        st[ver] = true;
        //掃描所有出邊
        for(int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > distance + w[i])
            {
                //更新,把新的二元組插入堆
                dist[j] = distance + w[i];
                heap.push({dist[j], j});
            }
        }
    }
    
    if(dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}
int main()
{
    cin >> n >> m;
    memset(h, -1, sizeof h);
    //構(gòu)建鄰接表
    for(int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
    }
    
    cout << dijkstra();
    return 0;
}
}

到了這里,關(guān)于Dijkstra算法求最短路的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(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)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    數(shù)據(jù)結(jié)構(gòu)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    最短路徑的算法有兩個(gè), Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解決的是 單源 最短路徑問(wèn)題 。 Floyd算法解決的是 多源 最短路徑問(wèn)題,并且可以處理負(fù)權(quán)圖 。 今天要講的就是Dijkstra算法。 加: feng--Insist (大寫(xiě)的i),進(jìn)java交流群討論互聯(lián)網(wǎng)+技術(shù)??伤饕狿PT等資料。 其他資料

    2024年02月11日
    瀏覽(95)
  • 【算法】求最短路徑算法

    【算法】求最短路徑算法

    從某頂點(diǎn)出發(fā),沿圖的邊到達(dá)另一頂點(diǎn)所經(jīng)過(guò)的路徑中,各邊上權(quán)值之和最小的一條路徑叫做最短路徑。 解決最短路徑的問(wèn)題有以下算法:Dijkstra 算法,Bellman-Ford 算法,F(xiàn)loyd 算法和 SPFA 算法等。 迪杰斯特拉算法(Dijkstra 算法)是典型最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其它

    2024年02月02日
    瀏覽(18)
  • 圖算法——求最短路徑(Floyd算法)

    圖算法——求最短路徑(Floyd算法)

    目錄 一、什么是最短路徑 二、弗洛伊德(Floyd)算法 三、測(cè)試程序 ????????求圖的最短路徑在實(shí)際生活中有許多應(yīng)用,比如說(shuō)在你在一個(gè)景區(qū)的某個(gè)景點(diǎn),參觀(guān)完后,要怎么走最少的路程到你想?yún)⒂^(guān)的下個(gè)景點(diǎn),這就利用到了求圖最短路徑的算法。求圖的最短路徑有很多

    2024年02月07日
    瀏覽(24)
  • 迪杰斯特拉算法(求最短路徑)

    迪杰斯特拉算法(求最短路徑)

    迪杰斯特拉算法用于查找圖中某個(gè)頂點(diǎn)到其它所有頂點(diǎn)的最短路徑,該算法既適用于無(wú)向加權(quán)圖,也適用于有向加權(quán)圖。 注意,使用迪杰斯特拉算法查找最短路徑時(shí),必須保證圖中所有邊的權(quán)值為非負(fù)數(shù),否則查找過(guò)程很容易出錯(cuò)。 迪杰斯特拉算法的實(shí)現(xiàn)思路 圖 1 是一個(gè)無(wú)

    2024年02月02日
    瀏覽(21)
  • 弗洛伊德算法(求最短路徑)

    弗洛伊德算法(求最短路徑)

    在一個(gè)加權(quán)圖中,如果想找到各個(gè)頂點(diǎn)之間的最短路徑,可以考慮使用弗洛伊德算法。 弗洛伊德算法既適用于無(wú)向加權(quán)圖,也適用于有向加權(quán)圖。使用弗洛伊德算法查找最短路徑時(shí),只允許環(huán)路的權(quán)值為負(fù)數(shù),其它路徑的權(quán)值必須為非負(fù)數(shù),否則算法執(zhí)行過(guò)程會(huì)出錯(cuò)。 弗洛

    2024年02月06日
    瀏覽(21)
  • 求最短路徑的三種算法

    目錄 一.單源最短路 1.dijkstra算法及實(shí)現(xiàn) 2.spfa算法及實(shí)現(xiàn) (1)spafa負(fù)環(huán)判斷及實(shí)現(xiàn) 二.多源最短路 1.floyd算法及實(shí)現(xiàn) 一.單源最短路 1.dijkstra算法及實(shí)現(xiàn) 求源點(diǎn)到圖中其余各頂點(diǎn)的最短路徑 dfs效率慢,解決規(guī)模小,bfs只能邊權(quán)為1的圖 Dijkstra算法——迪杰斯塔拉算法(非負(fù)全圖)

    2024年02月14日
    瀏覽(21)
  • Acwing.854 Floyd求最短路 (Floyd算法)

    給定一個(gè)n個(gè)點(diǎn)m條邊的有向圖,圖中可能存在重邊和自環(huán),邊權(quán)可能為負(fù)數(shù)。 再給定k個(gè)詢(xún)問(wèn),每個(gè)詢(xún)問(wèn)包含兩個(gè)整數(shù)x和y,表示查詢(xún)從點(diǎn)x到點(diǎn)y的最短距離,如果路徑不存在,則輸\\\"impossible”。 數(shù)據(jù)保證圖中不存在負(fù)權(quán)回路。 第一行包含三個(gè)整數(shù)n, m, k 接下來(lái)m行,每行包含三

    2024年02月13日
    瀏覽(23)
  • Bellman-Ford-貝爾曼-福特-算法求最短路-負(fù)環(huán)

    Bellman-Ford(貝爾曼-福特)算法基于松弛操作的單源最短路算法。 e[u]存u點(diǎn)的出邊的鄰點(diǎn)和邊權(quán),d[u]存u點(diǎn)到源點(diǎn)的距離。 初始化,ds]=0,d[其它點(diǎn)]=+o; 執(zhí)行多輪循環(huán)。每輪循環(huán),對(duì)所有邊都嘗試進(jìn)行一次松弛操作; 當(dāng)一輪循環(huán)中沒(méi)有成功的松弛操作時(shí),算法停止 為什么最壞需要

    2024年02月13日
    瀏覽(20)
  • C語(yǔ)言算法與數(shù)據(jù)結(jié)構(gòu),旅游景區(qū)地圖求最短路徑

    C語(yǔ)言算法與數(shù)據(jù)結(jié)構(gòu),旅游景區(qū)地圖求最短路徑

    本次作業(yè)要求完成一個(gè)編程項(xiàng)目。請(qǐng)?zhí)摌?gòu)一張旅游景區(qū)地圖,景區(qū)地圖包括 景點(diǎn)(結(jié)點(diǎn))和道路(邊):地圖上用字母標(biāo)注出一些點(diǎn),表示景點(diǎn)(比如,以點(diǎn) A、B、C、D、E、F等(至少6個(gè)點(diǎn))多個(gè)表示,其中的 兩個(gè)字母 A 和 B 分別表示景區(qū)的入口和出口 );點(diǎn)與點(diǎn)之間的連

    2024年02月04日
    瀏覽(19)
  • 最短路徑(Dijkstra算法)

    最短路徑(Dijkstra算法)

    (1)最短路徑: 非網(wǎng)圖:兩頂點(diǎn)之間經(jīng)歷邊數(shù)最小的路徑 網(wǎng)圖:兩頂點(diǎn)之間經(jīng)歷的 邊上權(quán)值之和 最短的路 1.思路 設(shè)置一個(gè)集合S存放已經(jīng)找到最短路徑的頂點(diǎn),并設(shè)置一個(gè)源點(diǎn),dist[]數(shù)組中存放源點(diǎn)距離每個(gè)頂點(diǎn)的最短距離,path[]數(shù)組中存放的是最短路徑,基本過(guò)程可以如

    2024年02月09日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包