首页 > 其他分享 >图/树的搜索/存储/拓扑排序

图/树的搜索/存储/拓扑排序

时间:2023-08-02 19:23:34浏览次数:27  
标签:存储 单链 idx int 拓扑 编号 排序 节点

  • 深度优先搜索

    • 一条路走到黑
    • 回溯/剪枝
    • 每一个dfs都对应一个搜索树
    • 解决全排列,搜索所有可能解
  • 宽度优先搜索
    • 一层一层搜索
    • 解决最短路问题
搜索方式 数据结构 空间 特点
DFS stack O(h) 不具有最短性
BFS queue O(2^h) 最短路
  • 树与图的存储

    • 有向图/树

      • 每条边建一次
        add(a, b);
        
      • 存储:
        • 邻接矩阵:
          • 存稠密图,无法存重边,浪费空间
        • 邻接表:
          • 单链表数组,有几个点就开几个单链表,每个单链表存储该点可以到的点
          • 代码:
            //h[i]存储以节点i为起点的单链表,单链表中的节点存的是节点i能够到达的所有节点
            //以节点的编号代指结点,但是节点有两类,一类是图中的节点,一类是链表中的节点
            //idx分配单链表中的节点的编号,而不是图中节点的编号,注意区分
            //h[i]中的i是图中节点的编号,存的是单链表节点编号
            //e[i]中的i是单链表中节点的编号,存的是图中节点的编号,e[i]表示i节点存储的图中的节点
            //ne[i]中的i是单链表中节点的编号,存的是单链表点的编号,ne[i]表示i节点的下一个链表节点
            //链表节点下标以1开始,0表示空节点
            int h[N], e[N], ne[N], idx = 1;
            
            void add(int a, int b){//插入节点a指向b的一条边
            	e[idx] = b;//单链表节点的值就是图中节点
            	ne[idx] = h[a];
            	h[a] = idx;
            	idx ++ ;
            }
            
    • 无向图/树

      • 每条边建两次
        add(a, b);
        add(b, a);
        
  • 树与图的深度优先遍历

    • 有向图/树的深度优先遍历

    • 树的优先遍历可以求出子树的节点数
    • 代码:
      bool st[N];//标记是否被访问过
      void dfs(int u){
      	st[u] = true; //设置为已标记
      	for(int i = h[u]; i; i = ne[i]){ //遍历节点u的单链表
      		int j = e[i]; //取链表节点的值(图中节点的编号)
      		if(!st[j]) dfs(j); //没有被访问过就访问
      	}
      }
      
  • 树与图的宽度优先遍历

    • 有向图/树的宽度优先遍历

  • 拓扑排序

    • 拓扑排序是一个有向无环图的所有顶点的线性序列。且该序列必须满足下面两个条件:
    • 每个顶点出现且只出现一次。
    • 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
    • 只要图中有环,那么该图不存在拓扑序列
    • 拓扑序不唯一
    • 代码:
      //将所有入度为0的节点i优先入队
      //删除以节点i为起点j为终点的所有边,同时更新j的入度
      //再次将所有入度为0的节点j入队
      //建图步骤省略
      int q[N], hh, tt = -1;//队列
      int d[N];//存储每个节点的入度
      //初始化入度与图
      cin >> a >> b;
      add(a, b);
      d[b] ++ ;
      
      void topsort(){
      	for(int i = 1; i <= n; ++ i)//遍历所有节点
      		if(!d[i]) q[ ++ tt] = i;//将入度为0的节点优先入队
      	//BFS
      	while(hh <= tt){ //队列非空
      		int x = q[hh ++ ]; //队首出队
      		for(int i = h[x]; i; i = ne[i]){
      			int j = e[i];//遍历以x为起点的所有边的终点
      			d[j] -- ; //删边,更新入度
      			if(!d[j]) q[ ++ tt] = j; //将所有入度为0的点入队
      		}
      	}
      	if(tt == n - 1) //所有点都在q数组时,存在拓扑序
      		for(int i = 0; i < n; ++ i) cout << q[i];
      	else cout << -1;//不存在拓扑序
      }
      

标签:存储,单链,idx,int,拓扑,编号,排序,节点
From: https://www.cnblogs.com/moilip/p/17601552.html

相关文章

  • 算法-06-冒泡排序
       importrandomdefbubble_sort(li):foriinrange(len(li)-1):forjinrange(len(li)-i-1):ifli[j]>li[j+1]:li[j],li[j+1]=li[j+1],li[j]li=[random.randint(0,20)foriinrange(15)......
  • 构建易于运维的 AI 训练平台:存储选型与最佳实践
    伴随着公司业务的发展,数据量持续增长,存储平台面临新的挑战:大图片的高吞吐、超分辨率场景下数千万小文件的IOPS问题、运维复杂等问题。除了这些技术难题,我们基础团队的人员也比较紧张,负责存储层运维的仅有1名同事,因而组件的易用性,一直也是我们评估的重要维度。我们尝试过文件......
  • 算法-05-排序
      ......
  • 数据存储 data指南
    数据存储示例指南数据管理为开发者提供数据存储、数据管理能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全、可靠等管理机制。数据存储:提供通用数据持久化能力,根据数据特点,分为用户首选项、键值型数据库和关系型数据库。数据管理:提供高效的数据管理能力,包括权......
  • 面试-基本的算法要了如指掌,比如查找、排序、动态规划、分治等
    在了解这些基本算法之前还是得先了解这些基本的数据结构,这些都是要熟记与心的。基本数据结构比如:字符串、链表、二叉树、堆、栈、队列、哈希等字符串stringstr="helloworld";//使用格式//string是类。//str输出的大小,取决于size函数的返回值。链表classListNode{ pu......
  • SQL Server导出存储过程
    sqlserver批量导出视图selecttextfromsyscommentss1joinsysobjectss2ons1.id=s2.idwherextype='V'sqlserver批量导出存储过程selecttextfromsyscommentss1joinsysobjectss2ons1.id=s2.idwherextype='P'sqlserver批量导出函数selecttex......
  • 数据结构--排序
    什么是排序?排序:将无序序列排成一个有序序列的运算.排序的应用非常广泛.排序方法的分类按照储存介质分类.内部排序:数据量不大,数据在内存,无序内外存交换数据.外部排序:数据量较大,数据在外存(文件排序).按比较器个数分类串行排序:单处理机(同一时刻比较一对元素)......
  • 2.整数奇偶排序
    【题目】给一个10个整数的序列,要求对其重新排序。排序要求:1.奇数在前,偶数在后;2.奇数按从大到小排序;3.偶数按从小到大排序。输入格式   输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于100。输出格式   按照要求排序后输出一行,包含排序后......
  • CentOS 7中搭建NFS文件共享存储服务的完整步骤
    1、https://pythonjishu.com/yemqmdrvwtbrciq/ 步骤一:安装NFS工具在命令行中执行以下命令:sudoyuminstallnfs-utils步骤二:创建共享目录在命令行中执行以下命令:sudomkdir/mnt/nfs_share步骤三:配置NFS服务用以下命令来打开“/etc/exports”文件,并在文件结尾添加如......
  • PHPHashtable 如何优化数组查找和排序
    PHPHashtable如何优化数组查找和排序PHP是一种高度流行的编程语言,被广泛用于web开发。它有很多的优点,例如易于学习、跨平台、简单易用的语法等等。而在PHP中,数组是一种非常常用的数据结构,它可以存储一组有序的数据,方便我们进行各种操作。PHPHashtable如何优化数组查找和排......