prim&kruska


#include <bits/stdc++.h>
using namespace std;
#define MAXV 50
typedef struct
{
    int no;//顶点编号
    char info;//顶点其他信息
} vertextype;
typedef struct //图的定义
{
    int edges[MAXV][MAXV];//邻接矩阵
    int n,e;//顶点、边数
    vertextype vexs[MAXV];//存放顶点信息
} mgraph;
typedef struct edge
{
    int u,v,w;
    /*   edge(int a,int b,int c):u(a),v(b),w(c){}
       bool operator<(const edge& a)const{//权值升序
             return this->w>a.w;}
    */
} edge;

void insertsort(edge *E,int n)
{
      int k;
      for(int i=1;i<=n;i++){
            k=i;
            for(int j=i;j<=n;j++){
                  if(E[k].w>E[j].w){
                        int x,y,z;
                        x=E[k].u;y=E[k].v;z=E[k].w;
                        E[k].u=E[j].u;E[k].v=E[j].v;E[k].w=E[j].w;
                        E[j].u=x;E[j].v=y;E[j].w=z;
                  }
            }
      }
}
void kruskal(mgraph g)
{
    int i,j,u1,v1,sn1,sn2,k=1,length=0;
    int vset[MAXV];
    edge E[MAXV*MAXV];//存放所有边
    for(i=1; i<=g.n; i++) //由g产生的边集E
        for(j=1; j<=g.n; j++)
        {
            if(g.edges[i][j]!=0&&g.edges[i][j]!=INT_MAX)
            {
                E[k].u=i;
                E[k].v=j;
                E[k].w=g.edges[i][j];
                k++;
            }
        }
    insertsort(E,g.e);//用直接插入排序对E数组按权值递增排序
    for(i=0; i<g.n; i++) //初始化辅助数组
        vset[i]=i;
    k=1;
    j=1;
    while(k<=g.n) //生成边数小于n时循环
    {
        u1=E[j].u;
        v1=E[j].v;//取一条边的头尾顶点
        sn1=vset[u1];
        sn2=vset[v1];//分别得到两个顶点所属的集合编号
        if(sn1!=sn2)   //两个顶点属于不同的集合
        {
            cout<<u1<<v1<<E[j].w<<endl;
            k++;//生成边数+1

            length+=E[j].w;
            for(i=1; i<=g.n; i++) //两个集合统一编号
                if(vset[i]==sn2)//sn2->sn1
                    vset[i]=sn1;
        }
        j++;//扫描下一条边
    }
    cout<<length;
}
void prim(mgraph g,int v)
{
    int lowcost[MAXV];
    int length = 0;//带权路径长度
    int i,j,k,mi,closest[MAXV];
    lowcost[0] = 0;
    for (i=0; i<g.n; i++)
    {
        lowcost[i] = g.edges[v][i];
        closest[i]=v;
    }
    for (i=1; i<g.n; i++)
    {
        mi=INT_MAX;
        for(j=0; j<g.n; j++)
            if ( lowcost[j]!=0&& mi> lowcost[j] )
            {
                mi=lowcost[j];
                k=j;
            }
        // cout<<closest[k]<<k<<mi<<endl;
        length+=mi;
        lowcost[k]=0;
        for(j=0; j<g.n; j++)
            if(g.edges[k][j]<lowcost[j]&&lowcost[j]!=0)
            {
                lowcost[j] =g.edges[k][j];
                closest[j]= k;
            }
    }
    cout<<length<<endl;
}
int main()
{
    mgraph g;
    int n,m,a,b,c;
    cin>>n>>m;
    g.n=n;
    g.e=m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            g.edges[i][j]=INT_MAX;//初始化边权值为无穷大
    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>c;
        g.edges[a][b]=c;
    }
    prim(g,n);
    kruskal(g);
    return 0;
}


Guess you like

Origin blog.csdn.net/weixin_44355876/article/details/89815286