AC代码:
//重新编写最短路径算法
#include <iostream>
#include <cstring>
#define max_vex 1001 //最多结点个数---不要加分号
#define inf 0x3f3f3f3f //十进制为1061109567,int 取值范围--2147483648 ~2147483647
using namespace std;
int value[max_vex][max_vex]; //存储边的权值
int visited[max_vex]; //标记该结点是否加入最短路径
int dist[max_vex]; //标记该结点至源点地最近距离
int vex, arc,start; //读取结点与边的数据
void DIG(int start)
{
//初始化visited数组
memset(visited, 0, sizeof(visited)); //刚开始谁都没访问过
for (int i = 0; i < vex; ++i) {
dist[i] = value[start][i]; //源点start到各个结点的最小距离
}
//将源点放到最短路径结点集合中
visited[start] = 1;
//更新最短距离数组
dist[start] = 0;
int num = 1; //每一轮循环将一个数值放入到最短路径结点集合中
while (num < vex)
{
//找出剩余节点中路径最短的结点
int minn = inf;
int t_i = 0; //记录最短路径结点的下标
for (int i = 0; i < vex; ++i) {
//前提是不在最短路径结点集合中
if (visited[i] == 0 && minn > dist[i]) {
minn = dist[i]; //就是那个最短路径的数值
t_i = i;
}
}
//将刚刚找到的节点加入到集合中
visited[t_i] = 1; //已经标记了
num++; //最短路径结点结合中结点数加1
//将这个结点加入到路径中后,更新所有节点到源点地最短路径
for (int i = 0; i < vex; ++i) {
//对非集合中的节点的最短路径进行更新
if (visited[i] == 0 && (dist[i] > dist[t_i] + value[t_i][i]))
{
//原来源点距离i的距离大于刚刚取得结点的最短路径加上该点至i的路径距离
dist[i] = dist[t_i] + value[t_i][i];
}
}
}
//输出重点end的最短路径 ---判断一下end值是否有效
for(int i=0;i<vex;++i){
if(i!=start){
if(dist[i]!=inf){
cout<<dist[i]<<" ";
}
else
{
cout<<"-1"<<" ";
}
}
}
cout<<endl;
}
int main() {
//输入数据,不必创建一个图
cin >> vex >> start;
for(int i=0;i<vex;i++){
for(int j=0;j<vex;j++){
cin>>value[i][j];
if(value[i][j]==0){
//将0转为inf,便于后续计算,不然给dist数组赋值时,会是0(代表路径距离为0)
value[i][j]=inf;
}
}
}
//至此邻接矩阵构造完毕
if (start >= 0 && start < vex) {
DIG(start);
}
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复