#include<bits/stdc++.h>
using namespace std;
struct E{//邻接链表
int next;
int cost;//代价
};
vector<E> edge[1005];
int dis[1005];
bool mark[1005];
int main(){
int m,n,a,b,c;
while(cin>>n>>m){//顶点数和边数
for(int i=1;i<=n;i++){
edge[i].clear();//初始化
dis[i]=-1;
mark[i]=false;
}
while(m--){
cin>>a>>b>>c;//a到b有一条权值为c的路径
E tmp;
tmp.cost=c;
tmp.next=b;
edge[a].push_back(tmp);//把b加入a的邻接链表
tmp.next=a;
edge[b].push_back(tmp);//把a加入b的邻接链表
}
int newP=1;
dis[newP]=0;
mark[newP]=true;
for(int i=1;i<n;i++){//n-1次更新dis
for(int j=0;j<edge[newP].size();j++){
int t=edge[newP][j].next;
int cost=edge[newP][j].cost;
if(mark[t]==true)continue;
if(dis[t]==-1||cost+dis[newP]<dis[t]){
dis[t]=dis[newP]+cost;
}
}
int min=100000;
for(int j=1;j<=n;j++){
if(mark[j]==true||dis[j]==-1)continue;
if(dis[j]<min){
min=dis[j];
newP=j;//起点的更新
}
}
mark[newP]=true;
}
for(int k=1;k<=n;k++){
cout<<dis[k]<<" ";
}
cout<<endl;
}
return 0;
}
迪杰斯特拉Dijkstra
猜你喜欢
转载自blog.csdn.net/chaokudeztt/article/details/104775264
今日推荐
周排行