/*
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;
}
Kruskal algorithm to achieve minimum spanning tree
Guess you like
Origin blog.csdn.net/AlberTesla/article/details/109342096
Recommended
Ranking