#include<bits/stdc++.h>
using namespace std;
int a[55][55];//存储从i点出发到j点的路径距离
int d[55];//存储从规定的点 到所有点的最短路径
bool f[55];//标记已经当作了 起始点的位置 不能重复找
int n,s;
const int INT=0x3f3f3f3f;//正无穷
int main(){
cin>>n>>s;
//输入对应的权值
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
//设置所有的距离作为正无穷
memset(d,INT,sizeof(d));
d[s]=0;
for(int i=1;i<=n;i++){
int mi=0;
//1-找到现在d存储距离中 最小的作为起始点
for(int j=1;j<=n;j++){
if(!f[j]&&(d[mi]>d[j]||mi==0)){
mi=j;
}
}
f[mi]=true;
for(int j=1;j<=n;j++){
if(!f[j]&&a[mi][j]!=0&&d[mi]+a[mi][j]<d[j]){
d[j]=d[mi]+a[mi][j];
}
}
}
//2-从最小的距离始点出发
for(int i=1;i<=n;i++){
if(i!=s){
if(d[i]!=INT){
cout<<d[i]<<" ";
}else{
cout<<"-1"<<" ";
}
}
}
return 0;
}
A. 最短路径 题目描述在带权有向图 GG 中,给定一个源点 vv ,求从 vv 到 GG 中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。在常用的单源点最短路
于 2024-08-09 22:24:13 首次发布