Kruskal algorithm to achieve minimum spanning tree

/*
	Author:Albert Tesla Wizard
	Time:2020/10/28 20:16
*/
#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 minside
{
    
    
    char adjvertex;
    int lowcost;
};
struct Edge
{
    
    
    char head;
    char tail;
    int lowcost;
};
bool cmp(Edge a,Edge b)
{
    
    
    return a.lowcost<=b.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;
}
Edge edge[MAXSIZE];
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;
        edge[i].head=c1;
        edge[i].tail=c2;
        edge[i].lowcost=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 vertexset[MAXSIZE];
void MinimumSpaningTree_Kruskal(Graph G)
{
    
    
    cout<<"最小生成树的边的集合:"<<endl;
    int v1,v2,vs1,vs2;
    for(int i=1;i<=G.vertexnum;i++)vertexset[i]=i;
    for(int i=1;i<=G.arcnum;i++)
    {
    
    
        v1=Locate(edge[i].head,G);
        v2=Locate(edge[i].tail,G);
        vs1=vertexset[v1];
        vs2=vertexset[v2];
        if(vs1!=vs2)
        {
    
    
            cout<<"("<<edge[i].head<<","<<edge[i].tail<<")";
            for(int j=1;j<=G.vertexnum;j++)
            {
    
    
                if(vertexset[j]==vs2)vertexset[j]=vs1;
            }
        }
    }
}
int main()
{
    
    
    system("color 5E");
    Graph G;
    create(G);
    sort(edge+1,edge+G.arcnum,cmp);
    print(G);
    MinimumSpaningTree_Kruskal(G);
    return 0;
}

Guess you like

Origin blog.csdn.net/AlberTesla/article/details/109342096
Recommended