经典算法之Prim算法

来源:互联网 发布:廊坊管家婆软件 编辑:程序博客网 时间:2024/06/08 18:45

此算法为Prim算法完整版。具体prim算法分析请见
http://blog.csdn.net/yeruby/article/details/38615045

/************************author's email:wardseptember@gmail.comdate:2017.11************************/#include<iostream>#define INF 100//INF为比图中任何权值都大的数#define maxSize 6using namespace std;typedef struct {//图的定义    float edges[maxSize][maxSize];//邻接矩阵的定义    int n, e;   //分别为顶点数和边数}MGraph;MGraph creatGraph(MGraph g);void prim(MGraph g, int v0, float &sum);//prim算法int main() {    MGraph g;//定义并初始化图g    g.edges[maxSize][maxSize] = { 0 };    g.n = maxSize; g.e = 10;    g=creatGraph(g);//创建一个图    float sum;    prim(g, 0, sum);    cout << "最小生成树的权值为:";    cout << sum<<endl;    return 0;}MGraph creatGraph(MGraph g) {/*此图的各个顶点为一个正无边形的顶点,加正中间一个点。正中间一个点与各个顶点相连*/    int i, j;    for (i = 0; i < maxSize; i++)    {        for (j = 0; j < maxSize; j++)        {            g.edges[i][j] = INF;        }    }    g.edges[0][1] = 6;    g.edges[1][0] = 6;    g.edges[0][2] = 1;    g.edges[2][0] = 1;    g.edges[0][3] = 5;    g.edges[3][0] = 5;     g.edges[1][2] = 4;    g.edges[2][1] = 4;    g.edges[1][4] = 3;    g.edges[4][1] = 3;    g.edges[2][3] = 2;     g.edges[3][2] = 2;    g.edges[2][4] = 7;    g.edges[4][2] = 7;    g.edges[2][5] = 8;    g.edges[5][2] = 8;    g.edges[3][5] = 9;    g.edges[5][3] = 9;    g.edges[4][5] = 11;    g.edges[5][4] = 11;    g.n = maxSize;    g.e = 10;    return g;}void prim(MGraph g, int v0, float &sum) {    float lowcost[maxSize], vset[maxSize]; /*lowcost[maxSize]用于存储当前生成树到剩余各顶点最短边的权值,    vset[maxSize]用于判断顶点是否并入生成树,vset[i]=1表示并入*/    int i, j, k,v ;    float min;    v = v0;    for (i = 0; i < g.n; ++i) {//lowcost存入v0到各顶点的权值,vset初始化        lowcost[i] = g.edges[v0][i];        vset[i] = 0;    }    vset[v0] = 1;//顶点v0并入树中    sum = 0;         for (i = 0; i < g.n - 1; ++i)//访问剩余的n-1个顶点。以下注释是此循环第一趟的注释,其他的类似    {        min = INF;        for(j=0;j<g.n;++j)//找到与v0相连的权值中的最小值            if (vset[j] == 0 && lowcost[j] < min)            {                min = lowcost[j];                k = j;            }        vset[k] = 1;//将顶点v并入树        v = k;        sum = sum + min;//sum记录最小生成树的权值        //更新刚并入树的顶点v到剩余各顶点最短边的权值,与v0相比较        for (j = 0; j < g.n; ++j)            if (vset[j] == 0 && g.edges[v][j] < lowcost[j])                lowcost[j] = g.edges[v][j];    }}

以上如有错误请立即指出,我立刻改正。