题目
给定n个点的带权有向图,求从1到n的路径中边权之和最小的路径。
dijkstra实现方法
用dist[i]表示i这个点到原点的最短距离,一开始初始化为无穷大,然后将原点设为0。
用ok[i]表示i这个点是否已经确定了最短路,一开始将原点设为已经找到。
然后每一次枚举每一个点,找到与原点最近且没有找到最短路的点,将它标记为已经找到最短路,再用这个点去更新其他的点,最终即可求得最短路。
代码
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m; 5 int dist[1005]; 6 bool ok[1005]; 7 int ma[1005][1005]; 8 int main(){ 9 cin>>n>>m; 10 memset(ma,0x3f,sizeof(ma));//先设置为无穷大 11 for(int i=1;i<=m;i++){ //读入 12 int a,b,c; 13 cin>>a>>b>>c; 14 ma[a][b]=c; 15 ma[b][a]=c; 16 } 17 memset(dist,0x3f,sizeof(dist));//将到每一个点的最短路设置为无穷大 18 dist[1]=0; 19 for(int i=1;i<=n;i++){ //主要步骤 20 int mmm,minn=0x3f3f3f; 21 for(int j=1;j<=n;j++){ 22 if(!ok[j]&&dist[j]<minn){ 23 minn=dist[j]; 24 mmm=j; 25 } 26 } 27 ok[mmm]=1; 28 for(int k=1;k<=n;k++){ 29 dist[k]=min(dist[k],dist[mmm]+ma[mmm][k]); 30 } 31 } 32 cout<<dist[n]; 33 return 0; 34 }