图的基本定义和知识归纳

  • 1.图的定义
  • 1.由顶点的又穷非空集合和顶点之间边的集合的组成;表示为G=(V,E)其中V是点集合,E是边集合
  • 图分为有向图和无向图。边上的值称为这条边的权。
  • 2.图的术语
  • 1.邻接,依附:无向图中,对于任意两个顶点vi和顶点vj,若存在边(vi,vj),则称顶点vi和顶点vj互为邻接点,同时称边(vi,vj)依附于顶点vi和顶点vj。
  • 2.度,入度,出度:在无向图中,顶点v的度是指依附于该顶点的边数,通常记为TD (v);在有向图中,顶点v的入度是指以该顶点为弧头的弧的数目,记为ID (v);在有向图中,顶点v的出度是指以该顶点为弧尾的弧的数目,记为OD (v)。
  • 3.完全图:无向完全图:任意两顶点之间都有一条边,即n个顶点就有n*(n-1)/2条边。有向完全图:任意两顶点之间都存在方向相反的两条边,同样是n个顶点边数是无向完全图的2倍。
  • 二、图的实现
  • 1.图的存储结构
  • 1.邻接矩阵。
  • 2.邻接表。
  • 邻接矩阵:a[i][j]表示边 ;i,j表示两个点,0为没有边,1为这两个点间有边。
  • 基本声明(课本摘取)
  • class MGraph
  • {
  •    public:
  •        MGraph(){}
  •        MGraph(int a[],int b[MaxSize][MaxSize],int n, int e );
  •    private:
  •        int  vertex[MaxSize]; //顶点个数信息
  •        int visited[MaxSize];
  •        int arc[MaxSize][MaxSize];
  •        int vertexNum, arcNum;
  • };
  • 构建(课件摘取)
  • MGraph::MGraph(int a[],int b[MaxSize][MaxSize],int n, int e)
  • {
  •     vertexNum=n; arcNum=e;    int i,j;
  •     for ( i=0; i<vertexNum; i++) {
  •         vertex[i]=a[i];
  •         visited[i]=0;
  •     }
  •     for ( i=0; i<vertexNum; i++) {//初始化邻接矩阵
  •        for ( j=0; j<vertexNum; j++) {
  •            arc[i][j]=0;  }
  •     }
  •       for (int i=0; i<vertexNum; i++){//初始化邻接矩阵
  •        for (int j=0; j<vertexNum; j++){
  •            arc[i][j]=b[i][j];  }
  •     }
  • }
  • 到这里又有两个比较重要的内容出现。深度优先遍历,广度优先遍历。
  • 深度优先。
  • 类似于树中的前序遍历。从特定的结点v开始。
  • 访问结点v。
  • 从v未被访问的临接点中选一个n访问,再从n开始深度优先遍历,直到所有结点被访问过。
  • 这也是用到了递归思想,我们也有一个标记数组,被访问过的序号会被标记1。
  • 广度优先。
  • 类似于树中的层序遍历。也是从特定结点v开始。
  • 访问结点v。
  • v的邻接点有v1.v2.v3...等,依次访问他们。
  • 再从这些结点依次出发访问它们未被访问的结点。直到所有节点被访问过。
  • 这个也是采用递归思想,也用到了队列,访问到入队,所有邻接点都被访问过出队。直到队空。
  • 这两个的具体代码就不给出了,在书中和课件中都十分详细。
邻接表
邻接表有顶点表结点和边表结点两种。前者存结点后者存与他邻接的点
顶点结点具体定义:
template <class T>
struct VertexNode 
{
      T vertex;
      ArcNode *firstedge;
};
表结点具体定义:
struct ArcNode
{   
      int adjvex; 
      ArcNode *next;
};
结构声明(课件摘取)
template <class T>
class ALGraph
{    
   public:
       ALGraph(T a[ ], int n, int e);  
       void DFSTraverse(int v);      
       void BFSTraverse(int v);  
  private:
 
       visited[MaxSize];       VertexNode adjlist[MaxSize];   
       int vertexNum, arcNum;       
};
构造(课件摘取)
template <class T>
ALGraph::ALGraph(T a[], int n, int e)
{   
    vertexNum=n; arcNum=e; 
    for (i=0; i<vertexNum; i++)   
    {
       adjlist[i].vertex=a[i]; visited[i]=0;
       adjlist[i].firstedge=NULL;      
    } 
    for (k=0; k<arcNum; k++)   
    {
        cin>>i>>j;    
        s=new ArcNode; 
        s->adjvex=j;              
        s->next=adjlist[i].firstedge;    
        adjlist[i].firstedge=s;
}
深度优先遍历和广度优先遍历 大体与邻接矩阵差不多就不多介绍。
 
大体比较重要的的内容大概这些,如有错误,多多指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值