上进小青年

导航

dijkstra

寻找从源结点到其他点之间的最短距离。

把给出的结点分成两组,一组a刚开始为空,另一组b为全部节点,dis[i]记录从源点到i结点的距离,同样当所有操作结束后dis[i]就是到达源点的最短距离啦,每次更新的时候dis[i]的距离都会缩小。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 const int inf=0x3f3f3f3f;
 7 int e[100][100],vis[100],dis[100];
 8 int main()
 9 {
10     int m,n;
11     int a,b,c;
12     while(cin>>n>>m){
13 
14 
15             ///初始化
16             for(int i=1;i<=n;i++){
17                 for(int j=1;j<=n;j++){
18                         if(i==j)e[i][j]=0;
19                 else
20                     e[i][j]=inf;
21                 }
22             }
23 
24 
25         for(int i=1;i<=m;i++){
26             cin>>a>>b>>c;
27             e[a][b]=c;///c为边a到b的距离
28             vis[i]=0;
29         }
30         for(int i=1;i<=n;i++)
31             dis[i]=e[1][i];
32         vis[1]=1;///此处的样例代码我们假设1为源点
33 
34         int u;
35         for(int k=1;k<=n-1;k++){///n个结点要遍历n-1次
36             int minn=inf;
37 ///每次都查找距离1最近的结点
38             for(int i=1;i<=n;i++){
39                 if(minn>dis[i]&&vis[i]==0){
40                         minn=dis[i];
41                           u=i;
42                 }
43             }
44 vis[u]=1;
45             for(int v=1;v<=n;v++){
46             if(e[u][v]<inf){
47                 if(dis[v]>dis[u]+e[u][v])
48                     dis[v]=dis[u]+e[u][v];
49             }
50             }
51         }
52         for(int i=1;i<=n;i++)
53             cout<<dis[i]<<" ";
54     }
55 
56 }
View Code

 

posted on 2016-09-12 21:08  上进小青年  阅读(148)  评论(0编辑  收藏  举报