实验七 最短路径
2018 年 11 月 13 日
实验内容与要求
根据输入的图形,输入起点和终点,求出最短路径和最短路径的
长度。
具体步骤
- 编写一段代码,接收键盘的输入定点的数量,并以输入的整数对作为边来建
立图形的邻接矩阵(无向权重图) 。
例如 : 5,6,12
表示定点 5 和定点 6 间有边,边的权重为 12。 - 打印出邻接矩阵。
- 输入起点和终点。
- 打印最短路径和最短路径的长度
- 样例:数据测试
输入:
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
*/