【算法系列学习】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 }