• 最小生成树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;
    }
  • 相关阅读:
    python读取文件的方法
    python中global 和 nonlocal 的作用域
    android环境安装及配置
    python学习——sys.argv
    python学习——urlparse模块
    android:cmd下面用adb打log
    获取系统的换行符
    python----字符串方法
    类的继承---多重继承(两个父类有相同方法名和参数)
    Djngo 请求的生命周期
  • 原文地址:https://www.cnblogs.com/ilovetheworld/p/10876069.html
Copyright © 2020-2023  润新知