图的邻接矩阵 广度深度遍历 王老师的代码

#include<iostream>
#include <string>                  //引入标准库中的头文件
#include “graph.h”                //引入头文件
using namespace std;

/*  
 *前置条件:图不存在
 *输    入:无
 *功    能:图的初始化
 *输    出:无
 *后置条件:构造一个空的图
 */
template <class T>
MGraph<T>::MGraph(T a[], int n, int e) //g(vname,4,0);        //调用Graph程序
{
 vertexNum=n;                 //顶点数
 arcNum=e;                    //边数
 int i,j,k;
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]=0;            
   for (k=0; k<arcNum; k++)   //依次输入每一条边,并修改邻接矩阵的相应元素
    {
cin>>i>>j;                    //边依附的两个顶点的序号
arc[i][j]=1;                  //置有边标志
arc[j][i]=1;   
       }
}

/*  
 *前置条件:图已存在
 *输    入:无
 *功    能:输出图中所有顶点的数据信息
 *输    出:图中所有顶点的数据信息
 *后置条件:图保持不变
 */
template <class T>
void MGraph<T>::PutVex( )           //取所有顶点           
{                                   //假设源点是第0个顶点,即顶点序号是0
 int i=0;
    for(i=0;i<vertexNum;i++)
    {                            //输出图中所有的顶点
          cout<<vertex[i]<<“/n”;
    }
}
/*  
 *前置条件:图已存在
 *输入:顶点i
 *功能:输出图中顶点i的数据信息
 *输出:图中顶点i的数据信息
 *后置条件:图保持不变
 */
template <class T>
void MGraph<T>::GetVex(int i,T v[MaxSize])      //取顶点i            
{                                               //假设源点是第0个顶点,即顶点序号是0
 v[i]=vertex[i];
    if (i>vertexNum) throw “位置”;              //顶点i不存在则抛出异常
 else
  cout<<v[i]<<“/n”;                       //返回顶点i 
}

/* 
 *前置条件:图已存在
 *输    入:顶点name,位置num
 *功    能:在图中num位置插入一个顶点name
 *输    出:如果插入不成功,抛出异常
 *后置条件:如果插入成功,图中增加了一个顶点
 */
template <class T>
void MGraph<T>::InsertVex(int num,T name)        //在图中插入一个顶点,其编号为i,值为value
{                                                //假设源点是第0个顶点,即顶点序号是0
 if ( num<0|| num>vertexNum) throw “位置”;       //如果num输入不正确抛出异常
 int row;                                        //行
 int col;                                        //列
 int numv;                                       //最后一个顶点所在的位置
  numv = vertexNum-1;
 if(num>-1)                                      //num存在
  vertexNum++;                                   //顶点数加1
for(int i=numv;i>num-1;i–)                      //i从最后一个顶点的下一个位置开始循环
 vertex[i]=vertex[i-1];                       //把从num位置的顶点到最后一个顶点均向后移一位
 vertex[num]=name;                            //把要插入的顶点的值放在num位置上
 for(row=numv;row>=0;row–)                      //把从num列到最后一列的元素均向下移一列
  {
    for(col=numv;col>=num;col–)
    arc[row][col+1]=arc[row][col];
     arc[row][num]=10000;
  }
  for(row=numv;row>=num;row–)                   //把从num行到最后一行的元素均向下移一行
   for(col=0;col<=numv+1;col++)
    arc[row+1][col]=arc[row][col];  
for(col=0;col<vertexNum;col++)
    arc[num][col]=10000;                   //把num位置所在的行、列的值均置为无穷大
 
 }
/*  
 *前置条件:图已存在
 *输    入:顶点pos
 *功    能:在图中删除顶点pos
 *输    出:如果删除不成功,抛出异常
 *后置条件:如果删除成功,图中减少了一个顶点,相应顶点所建立的边也消去
 */
template <class T>
void MGraph<T>::DeleteVex(int pos)              //删除第pos个顶点
{                                               //假设源点是第0个顶点,即顶点序号是0
 if ( pos<0||  pos>MaxSize) throw “位置”;       //如果pos输入不正确抛出异常
 int row;                                       //行
 int col;                                       //列
 int numv=vertexNum;                            //numv等于顶点数
  if(pos>-1){                                    //pos存在
   for(int i=pos;i<numv-1;i++)
   vertex[i]=vertex[i+1];                       //把从pos到最后的每个点的位置依次向前移一位
   vertexNum–;                                 //顶点数减1
   for(row=0;row<numv;row++)
   {
     for(col=pos;col<numv;col++)
    arc[row][col]=arc[row][col+1];        //把从pos列到最后一列的元素均向前移一列
     arc[row][numv-1]=10000;                    //把pos所在的列上的值置为无穷大
   }
   for(row=pos;row<numv;row++)
   for(col=0;col<numv;col++)
    arc[row][col]=arc[row+1][col];        //把从pos行到最后一行的元素均向上移一行
  }
}
/*  
 *前置条件:图已存在
 *输    入:顶点n、w
 *功    能:在图中删除顶点n、w 依附的边
 *输    出:如果删除不成功,抛出异常
 *后置条件:如果删除成功,图中减少了一条边
 */
template <class T>
void MGraph<T>::DeleteArc(int n, int w)        //在图中删除一条边,其依附的两个顶点的编号为i和j
{
 if ( n>MaxSize||  w>MaxSize) throw “位置”;    //如果输入不正确抛出异常
  arc[n][w]=arc[w][n]=10000;  
}
/*  
 *前置条件:图已存在
 *输    入:顶点i、j
 *功    能:在图中插入顶点i、j及其所依附的边
 *输    出:如果插入不成功,抛出异常
 *后置条件:如果插入成功,图中增加了一条边
 */
template <class T>
void MGraph<T>::InsertArc(int i, int j,int n)   //在图中插入一条边,其依附的两个顶点的编号为i和j
{
  if ( i>MaxSize||  j>MaxSize) throw “位置”;   //如果输入不正确抛出异常 
  arc[i][j]=n;
  arc[j][i]=n;
  cout<<“从”<<vertex[i]<<“到”<<vertex[j]<<“的路径长度为:”<<arc[i][j]<<“/n”; //输出插入的两顶点之间的路径
}
/*  
 *前置条件:图已存在
 *输    入:遍历的起始顶点v
 *功    能:从顶点v出发深度优先遍历图
 *输    出:图中顶点的一个线性排列
 *后置条件:图保持不变
 */  
int visited[MaxSize];
template <class T>
void MGraph<T>::DFSTraverse(int v)     //深度优先遍历图
{
 
 if ( v>vertexNum) throw “位置”;   //如果输入不正确抛出异常
     cout<<vertex[v]<<” “;
   visited[v]=1;                    //已访问v顶点  
      for (int j=0; j<vertexNum; j++)
   {
   if (arc[v][j]<10000 && visited[j]==0)
        DFSTraverse(j);
   } 
}    

/*  
 *前置条件:图已存在
 *输    入:遍历的起始顶点v
 *功    能:从顶点v出发广度优先遍历图
 *输    出:图中顶点的一个线性排列
 *后置条件:图保持不变
 */
int visited2[MaxSize];
template <class T>
void MGraph<T>::BFSTraverse(int v)     //广度优先遍历图
{
 //
  if ( v>vertexNum) throw “位置”;      //如果输入不正确抛出异常
  int front=-1;
  int rear=-1;                         //初始化队列,假设队列采用顺序存储且不会发生溢出
  cout<<vertex[v]<<” “;                //被访问顶点入队
  visited2[v]=1; 
  int Q[MaxSize];
  Q[++rear]=v;
  while (front!=rear)
  {
     v=Q[++front];                     //将队头元素出队并送到v中
     for (int j=0; j<vertexNum; j++)
       if (arc[v][j]<10000 && visited2[j]==0 ){
          cout<<vertex[j]<<” “;
    visited2[j]=1;
    Q[++rear]=j;
       }
  }
}

#include <iostream>
#include <string>                   //引入标准库中的头文件
#include “graph.cpp”                //引用graph.cpp文件
using namespace std;

int main(int argc, char* argv[])
{
 int i;
    int choose=1;                      //控制
    int which;                         //功能选择变量 
 string name;                       //插入顶点的值                                                          
    string vname[4]={“we”,”wo”,”er”,”tt”};  //初始化各顶点
    int pos1;                           //顶点
 int pos2;                           //顶点
 int m;                                                  
 MGraph<string> g(vname,4,0);        //调用Graph程序
   while ( choose==1 )                  //控制
 {
   cout << “需要输出顶点信息请按0” << “/n”;     //输入所要进行的操作的序号
   cout << “需要输出任意一个顶点信息请按1” << “/n”;
      cout << “需要边的信息输出请按2” << “/n”;
      cout << “需要删除请按3” << “/n”;
      cout << “需要插入请按4” << “/n”;  
   cout << “需要删除某条边请按5” << “/n”;
   cout << “需要插入某条边请按6” << “/n”;
   cout << “需要深度优先遍历请按7” << “/n”;
   cout << “需要广度优先遍历请按8” << “/n”;
   cout << “需要退出请按10” << “/n”;
      cin >> which;
      switch( which )                  //功能选择
   {
        
    case 0:                   //输出图的各顶点的值
       g.PutVex();                               
   
      break;     
   
    case 1:                   //输出图的任意顶点的值
    try
    {
    int i;
    cout<<“请输入顶点:”<<“/n”;
       cin>>i;
    g.GetVex(i,vname);                 
                       
    }
    catch(char*)
    {
    cout<<“输出不正确!”<<endl;
    }
   
      break;
  
    case 2:                       //输出图中的边     
      cout<<“所有的边的信息为:”<<“/n”;
    try
    {
    g.InsertArc(0,1,23);   //插入边
             g.InsertArc(1,2,34);
             g.InsertArc(2,3,12);          
    }
    catch(char*)
    {
     cout<<“输出不正确!”<<endl;
    }           
      break;               

       case 3:                        //删除hh顶点
          int hh ;
     cout<<“请输入要删除的顶点”<<“/n”;
        cin>>hh;
        try
     {
     g.DeleteVex(hh);                
     }
     catch(char*)
     {
        cout<<“删除失败!”<<endl;
     }
   break;

       case 4:                        //在nn位置插入值为name的顶点
       int nn ;
    cout<<“请输入要插入的顶点位置及名称”<<“/n”;
       cin>>nn>>name;     
       try
    {
     g.InsertVex(nn,name);
    }
    catch(char*)
    {
     cout<<“插入失败!”<<endl;
    }
   break;

       case 5:                      //删除两顶点之间的路径        
       cout<<“请输入两顶点:”<<“/n”;
    cin>>pos1>>pos2;
    try
    {
    g.DeleteArc(pos1,pos2);
    }
    catch(char*)
    {
       cout<<“插入失败!”<<endl;
    }
         
         break;

       case 6:                   //插入一条边        
       cout<<“请输入两顶点:”<<“/n”;
    cin>>pos1>>pos2;
    cout<<“请输入路径:”<<“/n”;
    cin>>m;
    try
    {
    g.InsertArc(pos1,pos2,m);
    }
    catch(char*)
    {
    cout<<“插入失败!”<<endl;
    }
         
         break;

       case 7:                  //深度遍历
    cout<<“请输入顶点:”<<“/n”;
    for (i=0; i<MaxSize; i++)                                                  
    visited[i] = 0;
    int mm;
    cin>>mm;
    try
    {
       g.DFSTraverse(mm);
    }
    catch(char*)
    {
       cout<<“输入失败!”<<endl;
    }
             
      break;

       case 8:                  //广度遍历
    cout<<“请输入顶点:”<<“/n”;   
    int visited2[MaxSize];
    for (i=0; i<MaxSize; i++)
        visited2[i]=0;
    int mr;
       cin>>mr;   
    try
    {
    g.BFSTraverse(mr);
       cout<<“/n”;
    }
    catch(char*)
    {
       cout<<“输入失败!”<<endl;
    }             
      break;
   
       case 10:              //退出
              choose=0;
            break;        
  }
 }   
return 0;
 }
  

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/zgjsisuo/article/details/1627016
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞