【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

https://vjudge.net/contest/66569#problem/A

http://blog.csdn.net/wangjian8006/article/details/7871889

邻接矩阵实现的单源最短路

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<utility>
 8 using namespace std;
 9 const int maxn=1e3+5;
10 const int inf=0x3f3f3f3f;
11 int a[maxn][maxn];
12 int T,n;
13 int Dijkstra()
14 {
15     //已经确定的顶点集合 
16     bool vis[maxn];
17     memset(vis,0,sizeof(vis));
18     //源点到该结点的最短距离,不断更新 
19     int dis[maxn];
20     //通过改变a[v][i]中的v来改变源点 
21     for(int i=1;i<=n;i++)
22     {
23         dis[i]=a[1][i];
24     }
25     //v为第i次加进去的顶点 
26     int v; 
27     for(int i=1;i<=n;i++)
28     {
29         int min=inf; 
30         for(int k=1;k<=n;k++)
31         {
32             if(!vis[k]&&dis[k]<min)
33             {
34                 min=dis[k];
35                 v=k;    
36             }
37         }
38         //将该结点加入顶点集 
39         vis[v]=1;
40         //对所有从v出发的边进行松弛 
41         for(int k=1;k<=n;k++)
42         {
43             if(!vis[k]&&dis[v]+a[v][k]<dis[k])
44             {
45                 dis[k]=dis[v]+a[v][k];
46             }
47         }
48     }
49     //最后的dis[n]就是想要的结果 
50     return dis[n];
51 }
52 int main()
53 {
54     scanf("%d%d",&T,&n);
55     //初始化 
56     memset(a,inf,sizeof(a));
57     for(int i=1;i<=n;i++)
58     {
59         a[i][i]=0;
60     }
61     int x,y,z;
62     for(int i=0;i<T;i++)
63     {
64         scanf("%d%d%d",&x,&y,&z);
65         //为避免平行边,去最小值 
66         a[x][y]=a[y][x]=min(a[x][y],z);
67      } 
68     int ans=Dijkstra();  
69     printf("%d\n",ans);
70     return 0;
71  } 
Dijkstra

 

posted @ 2017-04-03 23:26  shulin15  阅读(211)  评论(0编辑  收藏  举报