设为首页 加入收藏

TOP

最小生成树算法Prim算法
2014-02-08 13:36:02 来源: 作者: 【 】 浏览:103
Tags:最小 生成 算法 Prim

    Prim算法是任选一顶点作为起始点,从当前已纳入的顶点与未纳入的顶点间的所有路径中找出权最小的一条进行连接,循环直到所有的顶点都被纳入。代码如下:

    #include

    #include

    #include

    #include

    class graphic {

    public:

    graphic(int n){

    std::cout 《 "请输入顶点信息" 《 std::endl;

    int tmp;

    for(int i = 0; i != n; ++i){

    std::cin 》 tmp;

    vertexs.push_back(tmp);

    }

    for(int i = 0; i != n; ++i){

    paths.push_back(std::vector (n, std:: numeric_limits::max()));

    paths[i][i] = 0;

    }

    std::cout 《 "请输入边数:" 《 std::flush;

    int sum;

    std::cin 》 sum;

    int vi, vj, weight;

    for(int i = 0 ; i != sum; ++i){

    std::cout 《 "请输入边" 《 (i+1) 《 ":" 《 std:: flush;

    std::cin 》 vi 》 vj 》 weight;

    paths[vi][vj] = weight;

    paths[vj][vi] = weight;

    }

    }

    void prim(){

    int k = 0;

    std:: vector vec;

    std:: vector adj;

    for(size_t i = 0; i != vertexs.size(); ++i){

    vec.push_back( paths[0][i]);

    adj.push_back(0);

    }

    while(true ){

    int min = std::numeric_limits :: max();

    for(size_t j = 0; j != vertexs.size(); ++j){

    if(vec[j] != 0 && vec[j] < min){

    min = vec[j];

    k = j;

    }

    }

    if(min < std::numeric_limits :: max()){

    std::cout 《 adj[k] 《 "->" 《 k 《 std::endl;

    vec[k] = 0;

    }

    else{

    std::cout 《 "over" 《 std::endl;

    break;

    }

    for(size_t j = 0; j != vertexs.size(); ++j){

    if(vec[j] && paths [k][j] < vec[j]){

    vec[j] = paths[k][j];

    adj[j] = k;

    }

    }

    }

    }

    private:

    std:: vector vertexs;

    std:: vector > paths;

    };

    int main(){

    graphic g(9);

    g.prim();

    }

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c/c++常用算法-- 基本排序算.. 下一篇C++继承中方法的使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)