最短路dijkstra演算法

2021-10-10 10:55:37 字數 1481 閱讀 5381

一直想著把這個板子存一下,但老是忘了,結果每次還得自己手打

dijkstra最短路演算法有兩種方法   第一種n^2的時間,用乙個陣列維護起點到所有點最短距離,不斷的用最新點連進來的邊來更新陣列

第二種方法是 nlogm的  用乙個優先佇列來找出區域性最優解,進而擴散至全域性最優

???這麼快就這麼多人看

那我加點解釋:

首先考慮n^2的解法是用乙個除了起點,其餘點距離初始值均為inf 的陣列用於存放答案,然後把起點所連的邊連過去用於更新答案陣列,然後把起點標記,表示該點已經確定出答案了,然後從答案陣列中找到除了標記點外的最近的點,重複加邊更新答案陣列的操作,再把該點標記,直至答案陣列全被標記

區域性最優解擴散至全域性

洛谷單源最短路板子題

#includeusing namespace std;

const int n=2e5+7;

typedef long long ll;

const ll inf=1e18;

int n,m,s,t;

struct node

};vectorson[n];

ll ans[n];

void dijkstra()

); while(p.size()));}

}}int main()

); //son[a2].push_back();

}dijkstra();

for(int i=1;i<=n;i++) printf("%lld ",ans[i]);

// printf("%lld\n",ans[n]);

}

那再更點?

n^2   dijkstra(為了防止完全圖的情況)

#includeusing namespace std;

typedef long long ll;

const int n=2e5+7;

const ll inf=1e18;

ll dis[n];

int n,m,s,t;

vector>son[n];

int vis[n];

void dijkstra()

); son[a2].push_back();

}dijkstra();

for(int i=1;i<=n;i++) cout《再來乙個  floyd的  二維陣列存邊權,為解決n小的情況   可以生成乙個二維陣列存放任意乙個(i,j)的最短距離(方法是dp   不斷迭代)(似乎n次dijkstra也可啊!)

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

for(int k=1;k<=n;k++)

dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);

乙個三重迴圈就完事了,

bellman-ford   演算法我不會,之前似乎是學過的但是dijkstra夠用了就忘掉了

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...

dijkstra最短路演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...

最短路 Dijkstra演算法

這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...