zoukankan      html  css  js  c++  java
  • C++知识点 图论(树)

    一:图论的概念

           图是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。

           图和以前所学的变量数组栈这类的东西最大的不同就是直观,通过一个图就可以说明几十行表达式所要表示的关系。

           最基本的图由点和线构成,一个个离散的点代表着研究的对象,它们被称之为结点,而把它们串联起来的这些线我们称之为边。

           图能够表达晦涩难懂的文字,用图解题会更为好懂。

           图还分为有向图无向图之类的,下文看题会有涉及。

    二:图论能干的事

           图论最大的作用就是搜索,包括BFS和DFS,这叫做图遍历。

           广搜和深搜是用于在图中搜索节点的两种不同算法。它们通常用于确定我们是否可以从给定节点到达某个节点。

           BFS的目的是尽可能接近根节点遍历图,而DFS算法旨在尽可能远离根节点。

           最基本的题型精简一下就是下边这样

           从A到B的最短途径是什么?分别从距离和时间角度考虑。

           有没有办法从C到D?

           典型的搜索本子题叭


    (以下干货时间)

    三:图论中常用的知识点(性质)

          ①连通性

             任何两个顶点之间都可以通过一条路连接,这样的图称为连通的。相反称为不连通的。

             这就像只考虑铁路运输的时候,亚欧大陆显然是一个连通图(内陆岛屿不算!),而由于海洋的存在,它跟美洲大陆就挨不到一起,他俩放在一起就不是一个连通的图。

         ②树

            树比图论学的早真是令人匪夷所思,树作为图的一种,在代码领域运用极其广泛。

            一棵树主要由爸爸和儿子构成...

           哦不说错了,是子节点和父节点

           每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树

           这货真画出来根本不像棵树...你要把它倒过来看才能发现被称作树的真谛

           树里面最为常用的一棵(一种)就是二叉树,主要是因为所有的树经过改造都能变成它...它也因为所解决的问题不同被赋予了不同的名称

           空二叉树//只有一个根结点的二叉树//只有左子树//只有右子树//完全二叉树

           对于完全二叉树的问题则极为重要,因为它代表着完成一个计划的所有情况,搜索和DP往往就在完全二叉树中进行

          深度则指的是二叉树的高度,也就是所谓的家里几代人

          而普通树转二叉树,一般采用左“子女”右“兄弟”的方式来转化,一步一步对应走便可以得到需要的二叉树。

    四:算法本子

           又到了喜闻乐见的模板时间了,这次写出来的是二叉树中的搜索

    //首先我们先得有棵树叭
    //先写结点
    typedef struct node
    {

    int data; 
    struct node* left;
    struct node* right;
    } Node;
    //再写树根
    typedef struct
    {Node* root;} Tree;
    //现在就可以声明(构造)一棵树了

      oid insert(Tree* tree,int value)
      {
      Node* node=(Node*)malloc(sizeof(Node));
      node->data = value;
      node->left = NULL;
      node->right = NULL;
      }

    //一棵树的构造就完成了

           但是搜索的核心在于哪里?

           遍历!也就是所有的点都去找一遍,不管是树还是数组,都找一遍就能出来。

          判断树是不是空树之类的代码就不写了,直接上遍历

    void inorder(Node* node)
    {
        if (node != NULL)
        {
            inorder(node->left);
            printf("%d ",node->data);
            inorder(node->right);
        }
    } 

         这里用的是最常见的中序遍历,其他什么先序后序层次之类的遍历其实我也就听过...等碰到题的时候再说叭

          

         

           

  • 相关阅读:
    OpenACC 数据管理语句
    OpenACC 简单的直方图
    OpenACC 书上的范例代码(Jacobi 迭代),part 2
    OpenACC 书上的范例代码(Jacobi 迭代),part 1
    OpenACC parallel
    OpenCL 归约 1
    OpenCL 双调排序 GPU 版
    OpenCL 双调排序 CPU 版
    OpenCL 图像卷积 3 使用 CPU
    中括号记法
  • 原文地址:https://www.cnblogs.com/Jiangxingchen/p/12726373.html
Copyright © 2011-2022 走看看