/*
Author:Albert Tesla Wizard
Time:2020/10/28 20:16
*/
#include<bits/stdc++.h>
#define MAXSIZE 20
#define OK 1
using namespace std;
struct Graph
{
int vertexnum,arcnum;
int arc[MAXSIZE][MAXSIZE];
char vertex[MAXSIZE];
};
struct Edge
{
char head;
char tail;
int lowcost;
};
Edge edge[MAXSIZE];
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;
}
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;
for(int i=1;i<=G.vertexnum;i++)vertexset[i]=i;
for(int i=1;i<=G.arcnum;i++)
{
int v1=Locate(edge[i].head,G);
int v2=Locate(edge[i].tail,G);
int vs1=vertexset[v1];
int 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);
print(G);
sort(edge+1,edge+G.arcnum+1,cmp);
MinimumSpaningTree_Kruskal(G);
return 0;
}
克鲁斯卡尔算法实现最小生成树
最新推荐文章于 2024-08-14 23:59:53 发布