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

    //hlog 9958 最小生成树,prim算法 
    
    
    
    #include<iostream>
    using namespace std;
    const int Max=100,Maxval=INT_MAX;
    bool visited[Max];
    int dist[Max];
    struct Graph{
        int mat[Max][Max];
        int vexnum;
        void Creategraph(int n,int m);
        
    };
    
    void Graph::Creategraph(int n,int m)
    {
        int i,j,a,b,c;
        vexnum=n;
        for(i=0;i<vexnum;i++){//每一条边赋初值; 
            for(j=0;j<vexnum;j++)
            {
                mat[i][j]=Maxval;//一开始假设每一对顶点之间都是没边 
             } 
             mat[i][i]=0;//自己到自己为0 
        }
        for(i=0;i<m;i++)
        {
            cin>>a>>b>>c;//输入a到b有边,权值是c; 
            a--;//题目下标从一开始,我们是从零 
            b--;
            mat[a][b]=c;
            mat[b][a]=c;
        }
        
    }
    
    int Minvertex(int vexnum)//dist数组里找一个最小值,要求没被访问过 
    {
        int i,k=-1;
        int min=Maxval;
        for(i=0;i<vexnum;i++)
        {
            if(dist[i]<min&&visited[i]==false)
            {
             min=dist[i];
             k=i;
            }
        }
        return k;
    }
    
    int Prim(Graph G,int u){
        
        int i,v;
        for(i=0;i<G.vexnum;i++)
        {
            dist[i]=G.mat[u][i];//当前顶点的最小权值,不断变化 
            
        }
        fill(visited,visited+G.vexnum,false);//标记数组,一开始全为false; 
        visited[u]=true;
        for(v=1;v<=G.vexnum-1;v++)
        {
            int k=Minvertex(G.vexnum);
            if(k==-1) break;
           visited[k]=true;
           for(i=0;i<G.vexnum;i++)
           {
               if(visited[i]==false&&G.mat[k][i]<dist[i])
               dist[i]=G.mat[k][i];
           }
        }
        
        int res=0;
        for(i=0;i<G.vexnum;i++)
        {
            res+=dist[i];
        }
        return res;
    }
    
    int main()
    {
        int n,m,min;//顶点数,边数 
        while(cin>>n)
        {
            if(n==0) break;
            m=n*(n-1)/2;
            Graph G;//定义一个图G; 
            G.Creategraph(n,m);//建n个顶点,m条边的图 
            min=Prim(G,0);
            cout<<min<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Dart语言概览
    Flutter开发环境配置(MAC版)
    Jetpack系列:Paging组件帮你解决分页加载实现的痛苦
    Jetpack系列:应用内导航的正确使用方法
    Jetpack系列:LiveData入门级使用方法
    在Android平台使用SNPE应链接libc++库
    Android binder流程简图
    使用Visual Studio Code进行远程开发
    用clock()函数计时的坑
    OpenCV Mat格式存储YUV图像
  • 原文地址:https://www.cnblogs.com/ilovetheworld/p/10876069.html
Copyright © 2011-2022 走看看