标签:
Prim算法,代码核心在于一个双重循环,所以算法时间复杂度为O(n*n)。
该算法与图中的边数无关。
适用于计算边稠密的最小生成树。
/// Prim #define NUM 1000 #define maxint 1000000000 ///形参n为顶点个数,数组c为无向连通带权图的邻接矩阵 void Prim(int n,int c[][NUM]) { int lowcost[NUM]; ///权 int closest[NUM]; ///节点 int s[NUM]={false}; ///标记 ///初始化数组 for(int i=1;i<=n;i++) { lowcost[i]=c[1][i]; closest[i]=1; s[i]=false; } ///从顶点v1开始 s[1]=true; ///处理其余n-1个顶点 for(int i=1;i<n;i++) { ///在未处理的节点中,找最小权的节点 int min=maxint; int j=1; ///节点 for(int k=2;k<=n;k++) { if(lowcost[i]<min&&(!s[k])) { min=lowcost[i]; j=k; } } printf("%d %d\n",closest[j],j); ///加入节点到解集中 s[j]=true; ///根据新的节点,更新数组lowcost,和,closest for(int k=2;k<=n;k++) { if((c[j][k]<lowcost[k])&&(!s[k])) { lowcost[k]=c[j][k]; closest[k]=j; } } } }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5384523.html