图的创建,有向图的创建,利用Prim…

///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:
          int Vertices[20];//顶点信息的数组 
          int Edge[MaxVertices][MaxVertices];//边的权值 
          int numE;//当前的边输 
          int numV;//当前定点数 
  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(int i=0;i<MaxVertices;i++)
          for(int j=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(int j=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,vj w)";
      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(int j=1;j<n;j++)//初始化tree 
  {
  mintree[j-1].begin=1;//顶点入口 
  mintree[j-1].end=j+1;
  mintree[j-1].length=Edge[0][j];//带权值的邻接矩阵 
  }
  for(int k=0;k<n-1;k++)//求第K+1条边 
  {
  int min =MaxWeight;
    for(int j=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(int j=k+1;j<n-1;j++)
    {
    int d=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\t 1.创建图"<<endl;
    cout<<"\n\t 2.退出"<<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);
}

<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值