- prim算法是用来求最小生成树de,复杂度为o(n2),与dij差不多,不过dis的代表意义不同,同时注意kruskal算法的复杂度是eloge(e是边数),稀疏图kruskal算法好,稠密图prim算法好
- dis【i】意义为i点到最小树的最小距离,而dij算法中的dis【i】表示i到源点的距离
- pic【i】【j】表示i点到j点的距离
- vis【】=0表示在U集合,1表示在s集合
- 核心代码:
#define inf 999999999 void prime() { int sign,sum=0; for(i=1;i<=n;i++) { vis[i]=0; dis[i]=inf; } dis[1]=0;//起始点赋为0 for(i=1;i<=n;i++) { int mm=inf; for(j=1;j<=n;j++) { if(vis[j]==0&&dis[j]<=mm)//找到离树距离最小的点 { mm=dis[j]; sign=j; } } vis[sign]=1; sum+=dis[sign];//最小和的叠加 for(j=1;j<=n;j++) { if(vis[j]==0&&dis[j]>pic[sign][j])//更新【j】到树的最小距离 dis[j]=pic[sign][j]; } } }