#include<bits/stdc++.h>
using namespace std;
#define MaxSize 10
#include<queue>
class Mgragh{
private:
int vertex[MaxSize];//顶点
int arc[MaxSize][MaxSize];//矩阵
int vertexNum,arcNum;
int visited[MaxSize]={0};
public:
Mgragh(int a[],int n, int e){
vertexNum = n;
arcNum = e;
int i,j;
for(i = 0;i<vertexNum;i++){
vertex[i]=a[i];
}
for(i = 0;i<vertexNum;i++){
for(j = 0;j<vertexNum;j++){
arc[i][j]=2147483647;
}
}
for(int k = 0;k<arcNum;k++){
int weight;
cin>>i>>j>>weight;
arc[i][j]=weight;
arc[j][i]=weight;
}
}
void printMgragh(){
for(int i=0;i<vertexNum;i++){
for(int j=0;j<vertexNum;j++){
cout<<arc[i][j]<<" ";
}
cout<<endl;
}
}
void Prim_Print(){
int lowcost[vertexNum],adjvex[vertexNum];
lowcost[0]=0;
adjvex[0]=0;
for(int i=0;i<vertexNum;i++){
lowcost[i]=arc[0][i];
adjvex[i]=0;
}
for(int i=1;i<vertexNum;i++){
int minCost=2147483647;//先将最小代价设为最大
int k=0;
for(int j=1;j<vertexNum;j++){
if(lowcost[j]!=0&&lowcost[j]<minCost){
minCost=arc[0][i];//使代价降到最低
k=j;
}
}
if(k){
cout<<"(V"<<adjvex[k]<<"V"<<k<<")"<<endl;
}
lowcost[k]=0;//防止后面再次遍历到该边
for(int j=1;j<vertexNum;j++){
if(lowcost[j]!=0&&arc[k][j]<lowcost[j]){//如果k的与其他点的权值小于原本的最小权值
lowcost[j]=arc[k][j];
adjvex[j]=k;//标记该点和其他点已经相连
}
}
}
}
};
int main()
{
int arr[]={0,1,2,3,4,5};
Mgragh m(arr,6,10);
m.printMgragh();
cout<<endl;
m.Prim_Print();
}
- 选择一个起始顶点,将其加入最小生成树中;
- 在剩余的顶点中,选择一个与已加入的顶点相连的边权最小的顶点,将其加入最小生成树中;
- 重复上述过程,直到最小生成树包含所有顶点。