首先最外層迴圈n次,代表進行n次迭代確定每個點到起點的最小值,最後輸出的終點即為要找的最短路的距離。
dist[n]
用於儲存每個點到起點的最短距離
st[n]
用於在更新最短距離時 判斷當前的點的最短距離是否確定 是否需要更新
每次迭代過程中都需要找到當前未確定的最短距離的點中距離最短的點。
int t=-1
;for
(int j=
1;j<=n;j++
)
通過這層迴圈之後,就能找到當前未確定的最短距離的點中距離最短的點
所以將此點標記之後,用這個點來更新其餘點的距離。
for
(int j =
1; j <= n;
++j)
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。
請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。
第一行包含整數n和m。
接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。
輸出乙個整數,表示1號點到n號點的最短距離。
如果路徑不存在,則輸出-1。
1≤n≤500,
1≤m≤105,
圖中涉及邊長均不超過10000。
輸入樣例:
3 31 2 2
2 3 1
1 3 4
輸出樣例:
3
#include
#include
using
namespace std;
const
int n =
510;
int n, m;
int g[n]
[n];
int dist[n]
;bool st[n]
;int
dijkstra()
}if(dist[n]
==0x3f3f3f3f
)return-1
;return dist[n];}
intmain()
int t =
dijkstra()
; cout << t << endl;
return0;
}
原題鏈結
原題鏈結
首先,題目說明最優解唯一,並且需要輸出最優解所經過的點。這就不能只使用單純的dijkstra來做,因為dijkstra只可以求出來最短路,並不能標記所經過的點。所以輔助以dfs來求出所經過的點。
另外,在寫dijkstra時,還需要做一部分修改,因為題中可能存在多條最短路,但題目要求盡可能收集更多的救援隊員,還有統計一共有多少條路,因此當找到t之後,更新其他未確定的點時,需要加一些判斷,如果當前的dis
t[j]
==di
st[t
]+g[
t][j
]dist[j]==dist[t]+g[t][j]
dist[j
]==d
ist[
t]+g
[t][
j]時說明此時最短路不止一條,然後選擇救援部隊較多的一條。但是如果dis
t[j]
>di
st[t
]+g[
t][j
]dist[j]>dist[t]+g[t][j]
dist[j
]>di
st[t
]+g[
t][j
]就直接選擇這一條就可。
最後,dfs是根據dijkstra得到的dist來進行的,每次判斷當前dist是否等於現在的長度+g[now][i],如果是則說明此點是最短中的乙個點,然後將其加入路徑,直到找到目標點而且人數和路徑長度都相等時,說明找到了最優解的路徑。記得復原。
上**
#include
#include
#include
using
namespace std;
const
int n =
1010
;int num[n]
, dist[n]
, cnt[n]
, tot[n]
, path[n]
, idx;
int g[n]
[n];
int st[n]
;int n, m, s, d;
void
dijkstra()
st[t]
=true
;for
(int j =
0; j < n;
++j)
}elseif(
!st[j]
&& dist[j]
> dist[t]
+ g[t]
[j])}}
cout << cnt[d]
<<
" "<< tot[d]
<< endl;
}int flag[n]
;void
dfs(
int now,
int now_len,
int now_people)
for(
int i =
0; i < n;
++i)}}
intmain()
dijkstra()
;dfs
(s,0
,num[s]);
return0;
}
最短路 Dijkstra演算法
dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...
dijkstra最短路演算法
dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...
最短路 Dijkstra演算法
這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...