/*
Author:Albert Tesla Wizard
Time:2020/10/28
*/
#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 minside
{
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(minside a[],Graph G)
{
int i=1,Min,k;
while(!a[i].lowcost)i++;
Min=a[i].lowcost;
k=i;
for(int j=i+1;j<=G.vertexnum;j++)
{
if(a[j].lowcost<Min&&a[j].lowcost>0){Min=a[j].lowcost;k=j;}
}
return k;
}
void MiniSpanTree_PRIM(char v,Graph G)
{
cout<<"最小生成树的边的集合为:"<<endl;
minside closedge[G.vertexnum+1];
int 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;
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;
}
普里姆算法实现最小生成树
最新推荐文章于 2021-12-06 13:41:35 发布