[算法导论读书笔记]Prim算法

算法思想:

任意时刻的中间结果都是一棵树,每次花费最小的代价,用一条边把不在树中的结点加进来。
【最小生成树算法实例】
    现有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表公路造价。在分析了这张图后发现,任一对城市都是连通的。现在要求用公路把所有城市联系起来,如何设计可使得工程的总造价最少?

伪代码:

[算法导论读书笔记]Prim算法_第1张图片

代码示例:

#include <iostream>
using namespace std;
const int MAXN = 101;
const int infinity = 999999;
int Adj[MAXN][MAXN];

int EXTRACT_MIN( int *d, bool *visited, int n)
{
    int min = infinity;
    int m = -1;
    for ( int i = 0; i < n; i++ )
    {
        if ( !visited[i] && d[i] < min)
        {
            min = d[i];
            m = i;
        }
    }
    return m;
}

int MST_PRIM( int r, int n)
{
    int i;
    int *d = new int[n];
    bool *visited = new bool[n];

    for ( i = 0; i < n; i++)
    {
        d[i] = infinity;
        visited[i] = false;
    }

    d[r] = 0;
    int len = 0;
    for ( i = 0; i < n; i++)
    {
        int u = EXTRACT_MIN(d, visited, n);
        visited[u] = true;
        len += d[u];
        for ( int v = 0; v < n; v++)
        {
            if ( !visited[v] && Adj[u][v] < d[v])
            {
                d[v] = Adj[u][v];
            }
        }
    }
    delete [] d;
    delete [] visited;
    return len;
}

int main(int argc, char* argv[])
{
    int i, j;
    int num;
 
       for ( i = 0; i < num; i++ )
        {
            for ( j = 0; j < num; j++ )
            {
                cin >> Adj[i][j];
            }
        }

        cout << MST_PRIM(0, num) << endl;
    return 0;
}


测试:


[算法导论读书笔记]Prim算法_第2张图片

参考资料:

http://blog.sina.com.cn/s/blog_6ec5c2d00100szw1.html

http://net.pku.edu.cn/~course/cs101/2007/resource/Intro2Algorithm/book6/chap24.htm


你可能感兴趣的:([算法导论读书笔记]Prim算法)