日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

再会迪杰斯特拉(Dijkstra)

發(fā)布時間:2024/7/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再会迪杰斯特拉(Dijkstra) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

迪杰斯特拉算法

算法說明

迪杰斯特拉算法用來求解某一個起點到以其他所有點為終點的最短路徑長度;

算法思路-貪心算法

以下圖為例

  • 指定一個節(jié)點(即起點),例如計算“A”到其他節(jié)點的最短路徑;
  • 引入兩個集合(S,U),S集合包含所有已經(jīng)求出其最短路徑的點(以及其最短長度),U集合包括未求出的最短路徑的點;
    所有和起點A直接相連的節(jié)點更新其與A的距離為路徑長度,沒有直接相連的設(shè)置為+∞;

  • 從U集合中找出距離起點s路徑最短的點,加入S集合,例如第一步最小的為A->D,距離為2;
  • 更新U集合路徑,if(A->D+D->(B、C、E))(B、C、E),就更新U;

  • 重復執(zhí)行橫線內(nèi)兩步,直到所有的節(jié)點都被加到了集合U中;

下面使用迪杰斯特拉算法處理上圖

①選取起點為A,首先刷新所有和A點直接通過邊相連的點,即B、D點,將A->D置為2,A->B置為4,其他A->C,A->E均為正無窮

算法代碼

#include <stdio.h> #include <iostream> #include <map> #include <stack> #include <vector> #include <queue> #include <algorithm> #include <sstream> #include <cstring> #include <string.h> #include <stdlib.h> #define N 100005 #define INF 2147483647 typedef long long ll; using namespace std; typedef struct Edge {ll to;ll wei;Edge() {to=-1;wei=INF;//初始都為不可達狀態(tài)} } E; ll n,M,s; vector<E>m[N]; //鄰接表 bool wh[N]; //集合U和S,true代表節(jié)點已經(jīng)放入S,false表示還在U集合 ll dis[N]; //存放起點到節(jié)點的最短距離 ll cnt; //S集合元素個數(shù) void Dijkstra(int s) {wh[s]=true;cnt++;while (cnt!=n) {int Min=INF,Minindex=-1;//開始找S集合中距離s最近的節(jié)點for (int i=1; i<=n; i++) {if (!wh[i]&&(dis[i]<Min)) {Min=dis[i];Minindex=i;}}//此時找到了最小的邊//將此節(jié)點放到S集合wh[Minindex]=true;cnt++;//更新U集合路徑for (int i=0; i<m[Minindex].size(); i++) {dis[m[Minindex][i].to]=min(m[Minindex][i].wei+dis[Minindex],dis[m[Minindex][i].to]);}} } int main() {cin>>n>>M>>s;for (int i=1; i<=n; i++) {if(i==s) {dis[s]=0;} else {dis[i]=INF;}}ll f,t,w;for (ll i=1; i<=M; i++) { //存儲圖 cin>>f>>t>>w;int flag=0;//有向圖,不雙向 for (int j=0; j<m[f].size(); j++) { //重邊 if (m[f][j].to==t) {m[f][j].wei=min(w,m[f][j].wei);flag=1;break;}}if (flag==0) {E e;e.to=t;e.wei=w;m[f].push_back(e);}}//找到和起點直接相連的節(jié)點,設(shè)置和起點直接相連的距離for (int i=0; i<m[s].size(); i++) {dis[m[s][i].to]=m[s][i].wei;}Dijkstra(s);for (int i=1; i<=n; i++) {if (i==s) {(i==1)?cout<<0:cout<<" "<<0;continue;}(i==1)?cout<<dis[i]:cout<<" "<<dis[i];} }

上述算法即是最樸素的迪杰斯特拉算法,需要注意的是,算法考慮了頂點有重邊的情況,這是洛谷的題目要求的,題目鏈接:
P3371 【模板】單源最短路徑(弱化版)

但對于沒有優(yōu)化的迪杰斯特拉算法,題目的強化版就會直接TLE,分析樸素的Dijkstra算法,我們發(fā)現(xiàn)可以優(yōu)化的點有:

  • 每次尋找U集合中dis中最小的元素時使用了遍歷的方法,但我們可以使用小頂堆保證每次直接彈出最小的值,不需要再去遍歷;

對于優(yōu)先隊列,使用stl庫的priority_queue實現(xiàn)。

迪杰斯特拉算法的優(yōu)缺點

  • 優(yōu)點
    • 算法思路簡單,比較容易上手使用;
    • 經(jīng)典的最短路算法,適合大多數(shù)場景;
  • 缺點
    • 時間復雜度和其他算法相比不太理想,適用于節(jié)點n不太多的情況;
    • 不能處理存在總花費為負值且從源點S可達的環(huán)路的圖,因為顯然無限兜圈子花費會越來越小;
    • 事實上,存在負環(huán)的情況是抓住了貪心算法的弱點導致問題不能解決;

總結(jié)

以上是生活随笔為你收集整理的再会迪杰斯特拉(Dijkstra)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色片亚洲| 亚洲一区二区三区播放 | 国产一级黄色片子 | 五月天婷婷综合 | 亚洲制服丝袜av | 亚洲高清免费 | 免费黄色网址在线 | 欧美精品久久久久久久 | 操人网| 欧美日韩视频在线观看一区 | 最新国产毛片 | 中文字幕一本 | 欧美国产日韩一区 | 高清国产一区二区三区 | 国产一区二区三区视频在线观看 | 国产黄在线| 韩国av免费在线观看 | 久久精品黄aa片一区二区三区 | 色热热 | 91丨porny丨对白 | 三级精品视频 | 国产精品成人免费一区二区视频 | 亚洲无卡 | 涩涩视频免费 | 精品无码一区二区三区免费 | 夫妻性生活黄色大片 | 五月婷婷开心中文字幕 | 污污av | 天天干夜夜夜夜 | 国产精品白丝喷水在线观看 | 天天操天天干视频 | 国产女人18水真多18精品一级做 | 国产h在线 | 精品国产乱码久久久久久蜜臀网站 | 中文字幕一区在线观看 | 日本孰妇毛茸茸xxxx | 日本久久久久久久久久 | 日韩免费中文字幕 | 中文字幕一区二区人妻痴汉电车 | 天天射天天干天天 | 欧美日韩国产91 | 伊人伊人伊人 | 大又大粗又爽又黄少妇毛片 | 99热.com| 黄色1级大片 | 成人av网站大全 | 久久精品久久99 | 狠狠撸在线视频 | 大j8福利视频导航 | 国产成人精品一区二区在线观看 | 美女让男生桶 | 天天射一射 | 欧美在线性爱视频 | 婷婷六月天 | 国产真实的和子乱拍在线观看 | 好吊操视频这里只有精品 | 亚洲精选在线观看 | 精品视频导航 | 扒开美女内裤狂揉下部 | 操碰av | 成人做受黄大片 | 精品无码免费视频 | 日本黄色美女 | 成人黄性视频 | 成年人看的视频网站 | 日韩一区二区三区四区五区 | 欧美在线视频观看 | 日韩视频一区二区三区四区 | 成人黄色三级视频 | 99精品视频免费观看 | 亚洲男人在线 | 99爱免费| 五月激情综合网 | 糖心vlog精品一区二区 | 91av久久久| 丝袜视频一区 | 一级少妇片| 国产成人精品一区二区三区在线 | 我要色综合天天 | 久久先锋 | 猫咪av在线 | 天天天操操操 | 亚洲精品二区 | 四虎成人在线 | 久久久国产精品免费 | 日本91av | 空姐吹箫视频大全 | 草草在线观看视频 | 男生尿隔着内裤呲出来视频 | 精品在线观看一区二区 | 久久精品国产露脸对白 | 中文字幕一二三四区 | 免费在线观看网址 | 欧美做爰xxxⅹ性欧美大片 | 日韩精品视频网 | 毛片视 | 超碰干 | 91网站永久免费看nba视频 | 男人天堂视频网 |