• 最小生成树(Prim)


    思路:从当前的某一点出发,每次选择当前能到达最小值的点,然后标记访问过的点和更新能到达的点,重复执行直至所有点都被访问过。

    代码:

    #include<iostream>

    using namespace std;

    const int maxn = 1000+10;

    const int INF = 0x3fffffff;                               //  无穷的一半

    int map[maxn][maxn];                                      //存图

    int dis[maxn];

    int visited[maxn];

    int m,n;

    void init(){                                             //map的初始化

             for(int i=1; i<=n; i++)

                       for(int j=1; j<=m; j++)

                                map[i][j] = INF;

    }

    int prim(int m){

             int t,min,ans=0;

             int i, j;

             memset(visited,0,sizeof(visited));                    //标记函数的初始化,初始值为0.

             for(i=1; i<=m; i++){

                       dis[i] = map[1][i];

             }

             visited[1] = 1;                                      //标记使用过

             for(i=1; i<m; i++){

                       min = INF;

                       t = -1;

                       for(j=1; j<=m; j++){

                                if(!visited[j] && dis[j] < min){

                                         min = dis[j];

                                         t = j;

                                }

                       }

                       if(t == -1)                                    //没有最少生成树时直接返回

                                return INF;

                       ans += min;

                       visited[t] = 1;

                       for(int k=1; k<=m; k++){

                                if(!visited[k] && dis[k] > map[t][k]){     //没有使用过并且比当前更优时替换

                                         dis[k] = map[t][k];

                                }

                       }

             }

             return ans;

    }

    int main(){

             int a, b, t;

             while(cin>>n>>m, n){                        //   n为边的条数,m 为点的个数

                       init();

                       while(n--){

                                cin>>a>>b>>t;

                                map[a][b] = map[b][a] = t;

                       }

                       t = prim(m);

                       if(t != INF)

                                cout<<t<<endl;

                       else

                                cout<<"没有最小生成树"<<endl;

             }

             return 0;

    }

  • 相关阅读:
    第一课:神经网络与机器学习
    自然语言基础之分词、标注、命名实体识别
    工程能力-语言-框架
    二叉树
    spark入门
    微平台推荐系统介绍(基于java)
    简历项目的梳理和面试准备
    统计学习方法李航学习笔记
    NopCommerce fluent validation使用
    NopCommerce支持多语言
  • 原文地址:https://www.cnblogs.com/cbyniypeu/p/3379911.html
Copyright © 2020-2023  润新知