最短路 dijkstra算法

题目

给定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 } 

 

posted @ 2019-05-24 21:30  尹昱钦  阅读(197)  评论(0编辑  收藏  举报