Primm algorithm to achieve minimum spanning tree

/*
	Author:Albert Tesla Wizard
	Time:2020/10/28
*/
#include<bits/stdc++.h>
#define MAXSIZE 20
#define OK 1
using namespace std;
struct BinTree
{
    
    
    char data;
    BinTree* firstchild;
    BinTree* nextsibling;
};
struct Graph
{
    
    
    int vertexnum,arcnum;
    int arc[MAXSIZE][MAXSIZE];
    char vertex[MAXSIZE];
};
struct miniside
{
    
    
    char adjvertex;
    int lowcost;
};
int Locate(char v,Graph&G)
{
    
    
    for(int i=1;i<=G.vertexnum;i++)
    {
    
    
        if(G.vertex[i]==v)return i;
    }
    return -1;
}
int firstadjacent(char v,Graph G)
{
    
    
    int k=Locate(v,G);
    for(int i=1;i<=G.vertexnum;i++)
    {
    
    
        if(G.arc[k][i]!=0)return i;
    }
    return -1;
}
int nextadjacent(char v,char w,Graph G)
{
    
    
    int k1=Locate(v,G);
    int k2=Locate(w,G);
    for(int i=k2+1;i<=G.vertexnum;i++)
        if(G.arc[k1][i]!=0)return i;
    return -1;
}
int create(Graph&G)
{
    
    
    char c1,c2;
    int v1,v2;
    cout<<"请输入无向网的顶点数目:"<<endl;
    cin>>G.vertexnum;
    for(int i=1;i<=G.vertexnum;i++)
        for(int j=1;j<=G.vertexnum;j++)G.arc[i][j]=0;
    cout<<"请输入无向网的边的数目:"<<endl;
    cin>>G.arcnum;
    cout<<"请输入无向网的顶点集合:"<<endl;
    for(int i=1;i<=G.vertexnum;i++)cin>>G.vertex[i];
    for(int i=1;i<=G.vertexnum;i++)
        for(int j=1;j<=G.vertexnum;j++)
        G.arc[i][j]=G.arc[j][i]=INT_MAX;
    for(int i=1;i<=G.arcnum;i++)
    {
    
    
        cout<<"请输入无向网的边的两个顶点c1,c2(char):"<<endl;
        cin>>c1>>c2;
        v1=Locate(c1,G);
        v2=Locate(c2,G);
        if(v1==-1||v2==-1)exit(-1);
        cout<<"请输入无向网边的权值:"<<endl;
        int w;
        cin>>w;
        G.arc[v1][v2]=G.arc[v2][v1]=w;
    }
}
char GetVertex(int index,Graph G)
{
    
    
    if(index<=0||index>G.vertexnum)exit(-1);
    return G.vertex[index];
}
void print(Graph G)
{
    
    
    cout<<"无向图的顶点数目:"<<G.vertexnum<<endl;
    cout<<"无向图的顶点集合:";
    for(int i=1;i<=G.vertexnum;i++)cout<<G.vertex[i];
    cout<<endl;
    cout<<"无向图边的数目:"<<G.arcnum<<endl;
    cout<<"无向网的邻接矩阵:"<<endl;
    for(int i=1;i<=G.vertexnum;i++)
    {
    
    
        for(int j=1;j<=G.vertexnum;j++)
        cout<<G.arc[i][j]<<" ";
        cout<<endl;
    }
}
int Minimum(miniside* a,Graph G)
{
    
    
    int i=1,j,k,Min;
    while(!a[i].lowcost)i++;
    Min=a[i].lowcost;
    k=i;
    for(int j=i+1;j<=G.vertexnum;j++)
    {
    
    
        if(Min>a[j].lowcost&&a[j].lowcost>0){
    
    Min=a[j].lowcost;k=j;}
    }
    return k;
}
void MiniSpanTree_PRIM(char v,Graph G)
{
    
    
    int i,j,k;
    miniside closedge[MAXSIZE];
    k=Locate(v,G);
    for(int i=1;i<=G.vertexnum;i++)
    {
    
    
        if(i!=k)
        {
    
    
            closedge[i].adjvertex=v;
            closedge[i].lowcost=G.arc[k][i];
        }
    }
    closedge[k].lowcost=0;
    cout<<"最小生成树的边的集合为:"<<endl;
    for(int i=2;i<=G.vertexnum;i++)
    {
    
    
        k=Minimum(closedge,G);
        cout<<"("<<closedge[k].adjvertex<<","<<G.vertex[k]<<")";
        closedge[k].lowcost=0;
        for(int j=1;j<=G.vertexnum;j++)
        {
    
    
            if(G.arc[k][j]<closedge[j].lowcost)
            {
    
    
                closedge[j].adjvertex=G.vertex[k];
                closedge[j].lowcost=G.arc[k][j];
            }
        }
    }
}
int main()
{
    
    
    system("color 5E");
    Graph G;
    create(G);
    print(G);
    MiniSpanTree_PRIM(G.vertex[1],G);
    return 0;
}

Guess you like

Origin blog.csdn.net/AlberTesla/article/details/109340823