#include<iostream>
const int maxn=1001,inf=1000000000;
using namespace std;
int a[maxn][maxn],d[maxn],p[maxn];
int main(){
int i,j,k,m,n;
scanf("%d%d",&n,&m);//共n个点m条边 求走遍所有点的最小路径
for(i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[x][y]=a[y][x]=z;
}
for(i=1;i<=n;i++)d[i]=inf;
d[1]=0;
int ans=0;
for(i=1;i<=n;i++){
int zx=inf;
for(j=1;j<=n;j++)//找到离原点(注意是原点)最近的没有走过的点 使更新次数尽量少
if(!p[j] && d[j]<zx){
zx=d[j];
k=j;
}
p[k]=1;
ans+=d[k];//prim与dijkstra不一样的地方
for(j=1;j<=n;j++)
if(!p[j] && a[k][j]!=0 && d[j]>a[k][j])
d[j]=a[k][j];//prim的d数组存的到该点的最后一条边的长度 dijkstra存的是原点到该点的路径总长
}
printf("%d",ans);
return 0;
}
prim是从某点开始每次走到离此点最近的点
简单说一下prim与dijkstra的区别:
prim(貌似跟最小生成树是一样的吧)求的是图内保证所有点联通的最短路径和
dijkstra求的是图内某点到所有点的最短路径
所以数组存的也不一样 prim的数组存的的只是一条边的长度 dijkstra存的是多条边的长度和(目标点到原点的最短路)
本人刚入门 如有错误请见谅