///Graph.h
#include "iostream"
#include <iomanip>
#include <stdlib.h>
using namespace std;
const int MaxVertices=20;
const int MaxWeight=100;
struct MinSpanTree
{
int begin,end;//
int length;//边的权值
};
class AdjMWGraph
{
private:
intVertices[20];//顶点信息的数组
intEdge[MaxVertices][MaxVertices];//边的权值
intnumE;//当前的边输
intnumV;//当前定点数
public:
AdjMWGraph();//构造函数
void CreatG(int n,int e);//创建图函数
void PrintOut();//打印图数据
void Prim();//求最小生成树方法
void insertE();
void DeleteE();
};
//Graph.cpp
#include <cstdlib>
#include <iostream>
using namespace std;
#include "Graph.h"
AdjMWGraph::AdjMWGraph()//构造函数
{
for(inti=0;i<MaxVertices;i++)
for(intj=0;j<MaxVertices;j++)
{
if(i==j)
Edge[i][j]=0;//对角线为0
else
Edge[i][j]=MaxWeight;//无边是权值设为无穷大
}
numE=0;
numV=0;
}
void AdjMWGraph::PrintOut()
{
cout<<"\n输出顶点的信息(整形):\n";
for(int i=0;i<numV;i++)
{
cout<<"\t"<<Vertices[i];
}
cout<<"\n输出邻接矩阵:"<<endl;
for(int i=0;i<numV;i++)
{
cout<<"\n"<<i+1<<":";
for(intj=0;j<numV;j++)
cout<<"\t"<<Edge[i][j];
cout<<endl;
}
}
void AdjMWGraph::CreatG(int n,int e)
{
int vi,vj,w;
numE=e;
numV=n;
cout<<"\n输入顶点的信息";
//顶点赋值
for(int i=0;i<numV;i++)
{
cout<<"\n"<<i+1<<":";
cin>>Vertices[i];
}
//边赋值
for(int i=0;i<numE;)
{
cout<<"\n 输入边的信息(vi,vjw)";
cin>>vi>>vj>>w;
if((vi!=vj) &&(vi>0&&vi<numV)&&(vj>0&&vj<numV)&&(Edge[vi-1][vj-1]==MaxWeight) )
{
Edge[vi-1][vj-1]=w;
i++;
}
else
{
cout<<"\t插入位置错误或者边已经存在!\n\t"<<endl;
}
}
}
void AdjMWGraph::Prim()
{
int n=numV,m,v;
MinSpanTree e,mintree[MaxVertices];
for(intj=1;j<n;j++)//初始化tree
{
mintree[j-1].begin=1;//顶点入口
mintree[j-1].end=j+1;
mintree[j-1].length=Edge[0][j];//带权值的邻接矩阵
}
for(intk=0;k<n-1;k++)//求第K+1条边
{
int min =MaxWeight;
for(intj=k;j<n-1;j++)
if(mintree[j].length<min)//求麟边最小的
{
min=mintree[j].length;
m=j;
}
//交换方法置下个邻接点为终点
e=mintree[m];
mintree[m]=mintree[k];
mintree[k]=e;
v=mintree[k].end;//v从属u
for(intj=k+1;j<n-1;j++)
{
intd=Edge[v-1][mintree[j].end-1];
if(d<mintree[j].length)//循环找到当前点相邻的最小权
{
mintree[j].length=d;
mintree[j].begin=v;//置当前点为起点
}
}
}
for(int j=0;j<n-1;j++)
{
cout<<"\n"<<"起点:"<<mintree[j].begin<<"终点:"<<
mintree[j].end<<"权值:"<<mintree[j].length;
cout<<endl;
}
}
int main()
{
AdjMWGraph G;
int n,e;
int k;
do{
cout<<"\n\t1.创建图"<<endl;
cout<<"\n\t2.退出"<<endl;
cout<<"\n\t============="<<endl;
cout<<"\n\t请输入您的选择()"<<endl;
cin>>k;
switch(k)
{
case 1:
{
cout<<"\n请输入图的总顶点和总边数(n,e=?):";
cin>>n>>e;
G.CreatG(n,e);
G.PrintOut();
cout<<"最小生成树如下";
cout<<"共有"<<n-1<<"条边";
G.Prim();
}
break;
case 2:
exit(0);
}
}while(k>0&&k<5);
}
转发至微博
转发至微博