最短路徑問題 九度 OJ 1008

2021-09-20 09:31:56 字數 1310 閱讀 3769

在該題中不僅需要求得起點到終點的最短距離,還需要在有多條最短路徑的時,選取花費最少的那一條。要解決這個問題,只要更改 dijstra 演算法中關於「更近」的評判標準即可:有兩條路徑,若它們距離不一樣時,距離小的更近;若距離一樣時花費少的更近。當定義這種新的評判標準後,dijstra 演算法照樣能求得「最近」的路徑長度。

#include #include using namespace std;

struct e;

vectoredge[1001];//鄰接鍊錶

int dis[1001];//距離陣列

int cost[1001];//花費陣列

bool mark[1001];//是否屬於集合k陣列

int main()

scanf("%d%d",&s,&t);//輸入起點終點資訊

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

dis[s]=0;

mark[s]=true;

int newp=s;//起點為s,將其加入集合k,且其最短距離確定為0

for(int i=1;idis[newp]+c ||

(dis[t]=dis[newp]+c && cost[t]>cost[newp]+co))

}int min=123123123;

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

//選擇最小值,選擇時不用考慮花費的因素,

//因為距離最近的點的花費已經不可能由於經過其他點發生改變了

if(mark[j]==true)continue;

if(dis[j]==-1)continue;

if(dis[j]值得一提的是,若由結點 u 到結點 v 的最短路徑不存在,即它們不連通,那麼當 dijstra 演算法完成以後,v 結點仍然不屬於集合 k。即當完成 dijstra 演算法後,mark[v]依然為 false 即說明,結點 u 到結點 v 的最短路不存在。

注:該最短路不存在,指結點 u 和 v 不連通的情況,我們不考慮存在負環的情況,邊的權值為負這種特殊的情況在機試中考察的可能性不大,但若真的出現邊的權值為負,若不存在負環則最短路存在,但我們不能使用 dijstra 對其進行求解,因為 dijstra演算法原理在存在負權值的圖上不成立;若存在負環則最短路不存在。要求解包含負權值邊上的最短路問題,我們需要使用 spfa 演算法。

總結 dijstra 演算法的特點:它的時間複雜度為 o(n^2)(若在查詢最小值處利用堆進行優化,則時間複雜度可以降到 o(n*logn),n 為結點的個數。空間複雜度為o(n)(不包括儲存圖所需的空間)。它同時適用於鄰接矩陣和鄰接鍊錶形式儲存的有向圖和無向圖。它求解從某乙個特定的起點出發,到其它所有點的最短路徑,即單源最短路徑問題。

九度OJ 1008 最短路徑問題

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...

九度OJ 1008最短路徑問題

題目1008 最短路徑問題時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3219 解決 963 題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 ...

OJ 1008 最短路徑問題

include using namespace std const int n 1001 const int inf 100000000 typedef struct map map ma n n map temp n void init int n void dijkstra int s,int ...