zoukankan      html  css  js  c++  java
  • 最小生成树prim算法

    Prim算法

    设G=(V,E)是连通图,V={1,2,......,n}

    构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就坐如下的贪心选择:

    选取满足条件i属于S,j属于V-S,且c[i][j]最小边,并将顶点j添加到S中。这个过程一直进行到S=V时为止

    View Code
    #include<iostream>
    using namespace std;
    #define max 100
    float c[max][max];//存放i,j的权值
    float  lowcost[max];//lowcost[v]存放未放入生成树的一个顶点v到生成树所有顶点的最短边 
    int  adjves[max];// 表示该顶点v最短边在生成树中的顶点 
    
    void prim(int n){
        int s[max];//记录节点放入生成树的状态,0为未放入,1为已放入
        s[1]=1;//开始选择第一个节点放入生成树中 ,标记状态为1 
        
        
        //找到与第一个节点最小距离的节点 
        for(int i=2;i<=n;i++){ 
            lowcost[i]=c[1][i];//第i个节点到1节点的权值
            adjves[i]=1;//第i节点一生成树项链的顶点是1
            s[i]=0;//第i节点未放入生成树中 
        }
        
        for(int i=1;i<n;i++){
            float min=1000;//记录最最小权值的边
            int j=1;
            for(int k=2;k<=n;k++)
                if(lowcost[k]<min&&(s[k]!=1))
                   {
                     min=lowcost[k];
                     j=k;//记录最短边的节点 
                    }
            cout<<j<<" "<<adjves[j]<<endl;//打印加入生成树的节点j,并把j连接生成树的顶点输入
            s[j]=1;//节点j标记为已加入生成树
            for(int k=2;k<=n;k++)//找出与顶点j相邻的最短边的顶点 
               if(c[j][k]<lowcost[k]&&(s[k]!=1)){
                    lowcost[k]=c[j][k];
                    adjves[k]=j;
               } 
        } 
    }
    int main(){
        int n;//顶点的个数 
        int x,y;//相连的两个顶点 
        float value;//相邻两顶点的边权值 
        cout<<"请输入顶点的个数:"<<endl;
        cin>>n;
        for(int i=0;i<=n;i++)//初始化C二维数组 
           for(int j=0;j<=n;j++)
              c[i][j]=1000;//表示两顶点不相邻 
        cout<<"请输入顶点i与顶点j和它们之间的权值value(输入-1结束):"<<endl;
        cin>>x;
        while(x!=-1){//ctrl+z键结束 
            cin>>y>>value;
            c[x][y]=value;
            c[y][x]=value;
            cin>>x;
        }
        cout<<"最小生成树各节点的链接情况:"<<endl;
        prim(n);
        return 0;
    } 
  • 相关阅读:
    Codeforces Round #652 (Div. 2)
    Codeforces Round #651 (Div. 2)
    The 2017 China Collegiate Programming Contest, Qinhuangdao Site
    2017中国大学生程序设计竞赛-哈尔滨站
    Codeforces Global Round 8
    [CF768D] Jon and Orbs
    2020牛客暑期多校训练营(第一场)I
    2020牛客暑期多校训练营(第一场)F
    [HDU5769] Substring
    [PA2010] Riddle
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2763731.html
Copyright © 2011-2022 走看看