• 最小生成树—prim


    对象:有权无向图(带权连通图)

    图的存储:邻接矩阵且有0和INF的那种  or  邻接表。

    矩阵实现:

    #include<iostream>
    using namespace std;
    const int maxn=100;
    class graph
    {
        struct gra
        {
            int n;//vertex的个数
            int edges[maxn][maxn];    
        };
        gra g;
        int lowcost[maxn];
        int path[maxn];
        int total_value;//总代价 
        const int inf=327627;
        public :
            void make_graph()
            {
                total_value=0;
                cin>>g.n;//input vertex number
                for(int i=0;i<g.n;i++)
                   for(int j=0;j<g.n;j++)
                   {
                         int temp;
                         cin>>temp;
                         if(!temp&&i!=j)
                            g.edges[i][j]=inf;
                         else
                            g.edges[i][j]=temp;
                   }
            }
            void prim(int v)//v is begin vertex
            {
                for(int i=0;i<g.n;i++)
                    lowcost[i]=g.edges[v][i];
                path[0]=v;//起始点 begin vertex 
                for(int i=1;i<g.n;i++)
                {
                    int minn=inf;
                    int k;
                    for(int j=0;j<g.n;j++)
                    {
                        if(lowcost[j]&&lowcost[j]<minn)
                        {
                            minn=lowcost[j];
                            k=j;
                        }
                    }
                    path[i]=k;//next vertex
                    total_value+=minn;
                    lowcost[k]=0;//have visited
                    for(int j=0;j<g.n;j++)//用k行去更新lowcost 
                        if(lowcost[j]&&g.edges[k][j]<lowcost[j])
                            lowcost[j]=g.edges[k][j];
                }
             }
             int disp_total_value()
             {
                 cout<<total_value<<endl;;
             } 
    };
    int main()
    {
        graph g;
        g.make_graph();
        g.prim(0);
        g.disp_total_value();
        return 0; 
    }
    View Code

     邻接表实现:

    #include<iostream>
    using namespace std;
    const int maxn=100;
    const int inf=327627;
    class graph
    {
        struct arcnode//vertex
        {
            int adjvex;
            arcnode *nextarc;
            int weight; 
        };
        struct vnode//edges
        {
            arcnode *firstarc;
        };
        struct adjgraph
        {
            vnode adjlist[maxn];
            int n;//vertex number
        };
        adjgraph g;
        int lowcost[maxn],path[maxn];
        int total_value;
        public :
            void make_adjgraph()
            {
                cin>>g.n;
                total_value=0;
                for(int i=0;i<g.n;i++)
                    g.adjlist[i].firstarc=NULL;
                for(int i=0;i<g.n;i++)
                    for(int j=0;j<g.n;j++)
                    {
                        arcnode *temp=new arcnode;
                        temp->adjvex=j;
                        cin>>temp->weight;
                        if(temp->weight!=0)
                        {
                            temp->nextarc=g.adjlist[i].firstarc;
                            g.adjlist[i].firstarc=temp;
                        }
                    }
            }
            void prim(int v)
            {
                for(int i=0;i<g.n;i++)
                    lowcost[i]=inf;
                lowcost[v]=0;
                path[0]=v;
                arcnode *p=g.adjlist[v].firstarc;
                while(p!=NULL)
                {
                    lowcost[p->adjvex]=p->weight;
                    p=p->nextarc;
                }
                for(int i=1;i<g.n;i++)
                {
                    int minn=inf;
                    int k;
                    for(int j=0;j<g.n;j++)
                        if(lowcost[j]&&lowcost[j]<minn)
                        {
                            minn=lowcost[j];
                            k=j;
                         } 
                    lowcost[k]=0;
                    path[i]=k;
                    total_value+=minn;
                    arcnode *p=g.adjlist[k].firstarc;
                    while(p!=NULL)
                    {
                        if(lowcost[p->adjvex]&&p->weight<lowcost[p->adjvex])//lowcost 表示未拜访 
                          lowcost[p->adjvex]=p->weight;
                        p=p->nextarc;
                    }
                }
            }
            void disp_total_value()
            {
                cout<<total_value<<endl;
            }
     } ;
     int main()
     {
         graph g;
         g.make_adjgraph();
         g.prim(1);
         g.disp_total_value();
         return 0;
     }
    View Code

    例题地址:http://120.77.243.165/status.php?user_id=201703120136

    HNIEOJ 3960

  • 相关阅读:
    C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(1)
    多线程 C#解决方案小结
    10款交互设计原型开发工具
    创建自定义配置节
    禁用外键 oracle
    GUIDESIGNSTUDIO3中文帮助(1)欢迎使用 GUI Design Studio 3.0
    大数据量的数据库设计思考
    gui design studio 3 中文帮助(2)获取帮助
    NHibernate之旅(24):探索NHibernate二级缓存(下)(转)
    客户端原型GUI Design Studio
  • 原文地址:https://www.cnblogs.com/shenyuling/p/9985876.html
Copyright © 2020-2023  润新知