Dijkstra 最短路径算法

详见:http://wiki.jikexueyuan.com/project/easy-learn-algorithm/dijkstra.html

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 #define MAX 10000
 5 void printArr(vector<int> &arr){
 6     for(int i=0; i<arr.size(); ++i){
 7         cout<<arr[i]<<" ";
 8     }
 9     cout<<endl;
10 }
11 int main(){
12     //数据读入,输入为N(表示邻接矩阵的边长),后面紧接一个维度为N的邻接矩阵,-1表示正无穷
13     int N;
14     cin>>N;
15     vector<vector<int> > arr(N, vector<int>(N, 0));
16     for(int i=0; i<N; ++i){
17         for(int j=0; j<N; ++j){
18             cin>>arr[i][j];
19             if(arr[i][j]==-1)arr[i][j]=MAX;
20         }
21     }
22     int startPoint=0;//设置起点为0号点,当然也可以设置为1号、2号
23     vector<int> dist(N, 0);
24     for(int j=0; j<N; ++j)dist[j]=arr[startPoint][j];
25     vector<bool> flag(N, false);
26     flag[startPoint]=true;
27     int minIdx; 
28     for(int k=1; k<N; ++k){
29         int min=MAX;
30         for(int i=0; i<N; ++i){
31             if(flag[i]==false && dist[i]<min){
32                 min=dist[i];
33                 minIdx=i;
34             }
35         }
36         flag[minIdx]=true;
37         for(int j=0; j<N; ++j){
38             if(dist[j]>dist[minIdx]+arr[minIdx][j])dist[j]=dist[minIdx]+arr[minIdx][j];
39         }
40     }
41     //输出结果为startPoint(起点)到其他各点的最短路径值
42     printArr(dist);
43     return 0;
44 }

测试用例:

6
0 1 12 -1 -1 -1
-1 0 9 3 -1 -1
-1 -1 0 -1 5 -1
-1 -1 4 0 13 15
-1 -1 -1 -1 0 4
-1 -1 -1 -1 -1 0

 

posted @ 2018-08-14 17:04  jeysin  阅读(183)  评论(0编辑  收藏  举报