最小生成树 - 普利姆算法

#include<cstdlib>
#include<cstdio>
#include<cstring>
#define MAXVEX 100
#define INFINITY 65535

typedef struct {
    char vexs[MAXVEX];
    int arc[MAXVEX][MAXVEX];
    int numVextexes,numEdges;
}MGraph;

void CreateGraph(MGraph *G){
    int i,j,k,w;
    printf("输入顶点数和边数:\n");
    scanf("%d %d",&G->numVextexes,&G->numEdges);
    for(i=0;i<G->numVextexes;i++){
        scanf(&G->vexs[i]);
    }
    for(i=0;i<G->numVextexes;i++){
        for(j=0;j<G->numVextexes;j++){
            G->arc[i][j] = INFINITY;
        }
    }
    printf(" G->numEdges = %d \n",G->numEdges);
    for(k=0;k<G->numEdges;k++){
      //  printf(" k = %d \n",k);
         printf("输入边(Vi,Vj)上的下标1,和下标j和权w:\n");
        scanf("%d %d %d",&i,&j,&w);
        G->arc[j][i] = G->arc[i][j] = w;
    }
    return;
}
void MiniSpanTree_Prim(MGraph G){
    int min,i,j,k,p;
    int adjvex[MAXVEX]; //保存相关顶点下标
    int lowcost[MAXVEX];    //==========这个自己亲自多跑跑代码就懂了,不要懵,不要乱就能得出规律和结论
    lowcost[0] = 0;
    adjvex[0] = 0;
    for(i=1;i<G.numVextexes;i++){
        lowcost[i] = G.arc[0][i];
        adjvex[i] = 0;
    }
    for(i=1;i<G.numVextexes;i++){
        min = INFINITY;
        j = 1;k = 0;
       // for(p=0;p<G.numVextexes;p++)	printf("%d  ",adjvex[p]);
        while(j<G.numVextexes){
            if(lowcost[j] != 0 && lowcost[j] < min){
                min = lowcost[j];
                k = j;
            }
            j++;
        }
       // for(p=0;p<G.numVextexes;p++)	printf("%d  ",lowcost[p]);
        printf("\n(%d,%d)\n",adjvex[k],k);
        lowcost[k] = 0;
        for(j = 0;j< G.numVextexes;j++){
            if(lowcost[j]!=0 && G.arc[k][j] < lowcost[j]){
                lowcost[j] = G.arc[k][j];
                adjvex[j] = k;
            }
        }
    }
    return;
}
int main(){
    MGraph G;
    CreateGraph(&G);
    MiniSpanTree_Prim(G);
    return 0;
}

  

时间: 2024-10-07 11:20:34

最小生成树 - 普利姆算法的相关文章

最小生成树普利姆算法

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 20#define INFINITY  0x7ffffffftypedef struct{    int U[MAX][MAX];    char adj[MAX][10];    int vexnum, arcnum;}Graph;typedef struct{    char

普利姆算法(最小生成树)

int prim(){ int minid, i, j; double mincost; for(i = 2; i <= n; i ++){ lowcost[i] = map[1][i]; } lowcost[1] = -1; for(i = 2; i <= n; i ++){ mincost = INF; minid = 0; for(j = 2; j <= n; j ++){ if(lowcost[j] < mincost && lowcost[j] >

(转)最小生成树之普利姆算法、克鲁斯卡尔算法

 最小生成树之prim算法 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以把边上的权值解释为线路的造价.则最小生成树表示使其造价最小的生成树. 构造网的最小生成树必须解决下面两个问题: 1.尽可能选取权值小的边,但不能构成回路: 2.选取n-1条恰当的边以连通n个顶点: MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集.若(

POJ-2421-Constructing Roads(最小生成树 普利姆)

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26694   Accepted: 11720 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two

数据结构之 普利姆算法总结

Agri-Net Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area.

图-&gt;连通性-&gt;最小生成树(普里姆算法)

文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网.现在,我们要选择这样一个生成树,使总的耗费最少.这个问题就是构造连通网的最小代价生成树(Minimum Cost Spanning Tree: 最小生成树)的问题.一棵生成树的代价就是树上各边的代价之和. 有多种算法可以构造最小生成树,其他多数都利用的最小生成的MST(minimum

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个加权无向连通图,如何选择一个生成树,使权利的最小总和的边缘所有树,叫最小生成树. 求最小生成树算法 (1) 克鲁斯卡尔算法 图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间. (2) p=1313">普里姆算法 图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 . 以下来详细讲下: 克鲁斯卡尔算法

数据结构之最小生成树(普里姆算法)

1)普里姆算法 可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且 该边的权值在所有连通顶点v和w之间的边中取值最小.一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上 的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边. 例如:起始生成树上面就一个顶点.为了连通两个集合,在可选的边中,选择权值最小的.需要辅助数组,V-U中所有顶点. 具体实例如下图所示:求下图的最小生成树 我

数据结构-最小生成树-普里姆算法

转自https://blog.csdn.net/ZGUIZ/article/details/54633115 首先仍然是预定义: 1 #define OK 1 2 #define ERROR 0 3 #define Max_Int 32767 4 #define MVNum 100 5 6 typedef int Status; 7 typedef char VerTexType; 8 typedef int ArcType; 9 10 struct{ 11 VerTexType adjvex;