最小生成树,普里母和克鲁斯卡尔
2015-01-06 10:31
281 查看
<pre name="code" class="cpp">//邻接矩阵数据类型定义 #define MAXV 最大顶点个数 typedef char ElemType; typedef struct { int no; ElemType info; }VertexType; typedef struct { int edges[MAXV][MAXV]; int n,e; VertexType vexs[MAXV]; }MGraph; //最小生成树无向图(邻接矩阵) //Prim算法从顶点开始,时间复杂度只与顶点有关,适用于稠密图(边多)O(n^2) //Kruskal算法从边开始,时间复杂度只与边有关,适用于稀疏图O(e.log2底e的对数) void Prim(MGraph g,int v0,int &sum) { int lowcost[maxSize],vset[maxSize],v; int i,j,k,min; v=v0; for(i=1;i<=g.n;i++) { lowcost[i]=g.edges[v0][i];//存放V0到各个点的权值 vset[i]=0; } vset[v0]=1; sum=0; for(i=1;i<g.n;i++) { min=INF;//比图中所有边的权值都大的常量 //选出候选边的最小者 for(j=1;j<=g.n;j++) { if(vset[j]==0&&lowcost[j]<min) { min=lowcost[j]; k=j; } } vset[k]=1; v=k; sum+=min; //以v为媒介更新候选边 for(j=1;j<=g.n;j++) if(vset[j]==0&&g.edges[v][j]<lowcost[j]) lowcost[j]=g.edges[v][j]; } } //Kruskal typedef struct { int a,b;//顶点 int w;//权值 }Road; Road road[maxSize]; int v[maxSize]; int getRoot(int a) { while(a!=v[a]) a=v[a]; return a; } void Kruskal(MGraph g,int &sum,Road road[]) { int i; int N,E,a,b; N=g.n; E=g.e; sum=0; for(i=1;i<=N;i++) v[i]=i; sort(road,E);//对road按边权值小到大排序 for(i=1;i<=E,i++) { a=getRoot(road[i].a); b=getRoot(road[i].b); if(a!=b)//不同根,即相连不构成环,把不构成环的由小到大连起来 { v[a]=b; sum+=road[i].w; } } }
相关文章推荐
- 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)
- 最小生成树之克鲁斯卡尔(kruskal)算法
- 最小生成树之克鲁斯卡尔(Kruskal)算法实现,代码详解!!!!
- 【图】最小生成树(最小成本):克鲁斯卡尔(Kruskal)算法
- HDU 1879 继续畅通工程 (克鲁斯卡尔_最小生成树)
- hdu-1879-继续畅通工程(克鲁斯卡尔求最小生成树)
- 最小生成树之Kruskal(克鲁斯卡尔)算法
- 最小生成树——Kruskal(克鲁斯卡尔)算法
- poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法
- 关于最小生成树中的 Kruskal(克鲁斯卡尔)算法
- 最小生成树-克鲁斯卡尔-Kruskal算法
- poj2253 Frogger 克鲁斯卡尔变种算最小生成树最大边
- Swordfish (最小生成树——克鲁斯卡尔方法)
- POJ 3522 Slim Span【枚举+克鲁斯卡尔求最小生成树】
- 最小生成树——Kruskal(克鲁斯卡尔)算法
- 最小生成树——— 克鲁斯卡尔 hdu 1162 Eddy's picture
- 最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法
- HDU-1233-还是畅通工程(最小生成树 克鲁斯卡尔)
- 最小生成树算法汇总 (普里姆 && 克鲁斯卡尔与并查集结合)
- 图结构练习——最小生成树(克鲁斯卡尔)