#include <iostream> //最下面有数据验证
using namespace std;
const int INF=0x3f3f3f3f;
int e[100][100];
int dis[1000]; //存储各点到最小生成树的最短距离
int count;
int book[1000];
int sum;
int main (){
int n,m;
cin>>n>>m;
int i;int j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j)e[i][j]=0;
else e[i][j]=INF;
}
}
for(i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
e[u][v]=w; //无向图
e[v][u]=w;
}
for(i=1;i<=n;i++){
dis[i]=e[1][i]; //由于刚开始最小生成树只有1这一个点所以各点到树的最短距离
} //就是到点1的距离。
book[1]=1;
count++;
int Min;
int k;
while(count<n){//(n个点全入树则停)
Min=INF;
for(i=1;i<=n;i++){ //选出离树最近的点
if(book[i]==0&&dis[i]<Min){
Min=dis[i];
k=i;
}
}
book[k]=1; //然后将其加入树
count++;
sum+=dis[k];
for(i=1;i<=n;i++){ //并以该点的出边更新dis[]
if(book[i]==0&&dis[i]>e[k][i]){
dis[i]=e[k][i];
}
}
}
for(i=1;i<=n;i++){
if(i>1)cout<<" ";
cout<<dis[i];
}
cout<<endl;
cout<<sum<<endl;
return 0;
}
/*
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
/*
0 1 2 9 4 3
19
*/
最小生成树 (dijkstra)
最新推荐文章于 2023-03-28 21:11:37 发布