解题思路:
注意事项:
参考代码:
#include<stdio.h>
#include<string.h>
#define N 60
int dis[N];
int gxb[N][N];
int n,s;
void djsk()
{ int bj[N];
memset(bj,0,sizeof(bj));
int i,j,v=s,k=0,min=-1;
for(i=0;i<n;i++)dis[i]=gxb[v][i];//初始化
bj[v]=1;//标记 代表已经找到最短路
for(i=1;i<n;i++)//最多需要寻找n-1次可以全部找到最短路
{ k=0;min=-1;//最小值标记为-1 与 min=INF 等价
for(j=0;j<n;j++)//从未找到最短路径元素中找一个路径最短的
if(!bj[j]&&dis[j]&&(dis[j]<min||min==-1))k=j,min=dis[j];
//未找到最短路&&当前路径导通 找到最短的节点
bj[k]=1;
for(j=0;j<n;j++)//用但前最短路节点更新未找到最短路的节点
if(!bj[j]&&gxb[k][j]&&(dis[j]>(dis[k]+gxb[k][j])||!dis[j]))dis[j]=dis[k]+gxb[k][j];
//未找到最短路&&与当前节点导通&& 更新值大于之前的值
}
}
int main()
{ memset(dis,0,sizeof(dis));
int i,j,flag=0;
scanf("%d%d",&n,&s);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&gxb[i][j]);
djsk();
i=0;
for(i=0;i<n;i++)
{if(i==s)continue;
if(flag)printf(" ");
if(dis[i]>0)printf("%d",dis[i]);
else printf("-1");
flag=1;
}
printf("\n");
return 0;
}0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复