数据结构—dijkstra

实验七 最短路径

2018 年 11 月 13 日

实验内容与要求

根据输入的图形,输入起点和终点,求出最短路径和最短路径的
长度。

具体步骤

  1. 编写一段代码,接收键盘的输入定点的数量,并以输入的整数对作为边来建
    立图形的邻接矩阵(无向权重图) 。
    例如 : 5,6,12
    表示定点 5 和定点 6 间有边,边的权重为 12。
  2. 打印出邻接矩阵。
  3. 输入起点和终点。
  4. 打印最短路径和最短路径的长度
  5. 样例:数据测试

输入:

1,3,5
1,4,30
2,1,2
3,2,15
3,6,7
5,4,4
6,4,10
6,5,18
打印出计算 1,5 两点之间距离及最短路径

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 50; //代表最多的点的数量 
const int inf = 0x3f3f3f3f ; // inf 相当于一个很大的数,几乎取不到 

int G[maxn][maxn] ,dis[maxn] ,n ,u ,v ,w ; // G是存图的邻接矩阵 ,dis是起点到当前点的距离,n是点的数量 
bool vis[maxn] ; //标记当前点有没有被访问过 

void init() {
	memset(dis ,inf ,sizeof(dis)) ; 
	// memset函数 用法 :  ad : 
	//                                     for (int i = 0 ; i <= (dis数组的大小) ; i ++ ) {
	// memset(dis ,inf ,sizeof(dis))  =        dis[i] = inf;
	//                                     }
	//
	memset(vis ,false ,sizeof(vis));
	memset(G ,inf ,sizeof(G));
}

void dijkstra(int st) { // dijkstra 算法参见 :  
                        // https://blog.csdn.net/Acer12138/article/details/79381394
	dis[st] = 0 ,vis[st] = true ;
	int pos = st;
	for (int i = 1 ; i < n ; i ++ ) {
		for (int j = 1 ; j <= n ; j ++ ) {
			if ( !vis[j] && dis[pos] + G[pos][j] < dis[j] ) {
				dis[j] = dis[pos] + G[pos][j];
			}
		}
		int minn = inf ,v ;
		for (int j = 1 ; j <= n ; j ++ ) {
			if ( !vis[j] && minn > dis[j]) {
				v = j;
				minn = dis[j];
			}
		}
		vis[v] = true;
		pos = v;
	}
}

int main() {
	init() ; scanf("%d %d",&n,&m) ; // n vertix
	for (int i = 1 ; i <= m ; i ++ ) {
		scanf("%d %d %d",&u ,&v ,&w );
		G[u][v] = G[v][u] = w;
	}
	dijkstra(1) ;
	printf("%d
",dis[5] ) ;
	return 0;
}
/*
6
1,3,5
1,4,30
2,1,2
3,2,15
3,6,7
5,4,4
6,4,10
6,5,18
*/
原文地址:https://www.cnblogs.com/Nlifea/p/11745921.html