〆 • 8个月前
//计算(目前)到S的距离 //选出一个最短的 //更新其他点到S的距离,为原有最短路径和中转所经过新确定的点再到两者的较小值
using namespace std;
struct edge{
int to;
int value;
}; vector map[1001];
int dis[1001]; bool vis[1001];
int main(){
int n,m,s,from,to,value;
cin>>n>>m>>s;
for(int i=0;i<m;i++){
cin>>from>>to>>value;
map[from].push_back(edge{to,value});
}
memset(dis,0x3f,sizeof dis);
vis[s]=true;
for(edge e: map[s]){ //初始化可以直接到达那些点
dis[e.to]=min(dis[e.to],e.value);
}
for(int i=0;i<n-1;i++){
int minpoint=s;
for(int j=1;j<=n;j++){
if(dis[j]<dis[minpoint]&&!vis[j]){
minpoint=j;
}
}
vis[minpoint]=true;
for(edge e: map[minpoint]){ //其他点经过此点
if(!vis[e.to]){
dis[e.to]=min(dis[e.to],dis[minpoint]+e.value);
}
}
}
dis[s]=0;
for(int i=1;i<=m;i++){
if(dis[i]>10000){
dis[i]=-1;
}
}
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
return 0;
}
评论:
请先登录,才能进行评论