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

来源:互联网 发布:淘宝的询单有礼在哪里 编辑:程序博客网 时间:2024/06/10 11:42
///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);
}

 
0 0
原创粉丝点击