Prim算法,代码核心在于一个双重循环,所以算法时间复杂度为O(n*n)。
该算法与图中的边数无关。
适用于计算边稠密的最小生成树。
Prim算法采用贪心,不同于Kruskal算法的地方是,Prim算法筛选节点,找到下一条权最小的路。而Kruskal算法筛选权,来连接节点。
/// Prim bool Prim(int n) { memset(vis,0,sizeof(vis)); ///初始化每条路没走过 ///初始化到每个点的权为inf,第一次更新dis时,才会将邻接矩阵存入dis for(int i=1; i<=n; i++) { dis[i]=inf; } ans=0; dis[1]=0; ///处理每个点,加入到集合中去 for(int i=1; i<=n; i++) { int tmp=inf,k=0; for(int j=1; j<=n; j++) { ///找每个点,找到最小的权 if(!vis[j]&&dis[j]<tmp) { tmp=dis[j]; k=j; ///找到节点 } } if(tmp==inf) return false; vis[k]=true; ans+=tmp; ///更新最小权 for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]>a[k][j]) { dis[j]=a[k][j]; } } } return true; }