首页 > 其他分享 >笔记

笔记

时间:2023-07-20 10:45:15浏览次数:30  
标签:结点 删除 int 2996368 笔记 vector leafs

  $$
n^{n-2}:有标号的n个点构成的树
$$

prufer序列:https://blog.csdn.net/Code92007/article/details/106790551/

https://oi-wiki.org/graph/prufer/

建立:

过程

给一个例子吧,这是一棵 7 个结点的树的 Prüfer 序列构建过程:

Prüfer

 // 代码摘自原文,结点是从 0 标号的
 vector<vector<int>> adj;
 ​
 vector<int> pruefer_code() {
   int n = adj.size();
   set<int> leafs;
   vector<int> degree(n);
   vector<bool> killed(n, false);
   for (int i = 0; i < n; i++) {
     degree[i] = adj[i].size();
     if (degree[i] == 1) leafs.insert(i);
  }
 ​
   vector<int> code(n - 2);
   for (int i = 0; i < n - 2; i++) {
     int leaf = *leafs.begin();
     leafs.erase(leafs.begin());
     killed[leaf] = true;
     int v;
     for (int u : adj[leaf])
       if (!killed[u]) v = u;
     code[i] = v;
     if (--degree[v] == 1) leafs.insert(v);
  }
   return code;
 }
 ​
$$
n个点有标号的有根数计数:n^{n-2}*n=n^{n-1}
$$

线性构造

线性构造的本质就是维护一个指针指向我们将要删除的结点。首先发现,叶结点数是非严格单调递减的。要么删一个,要么删一个得一个。(翻译到这突然就知道该怎么做了,然后对照原文发现没什么问题,于是自己口糊吧)

过程

于是我们考虑这样一个过程:维护一个指针p。初始时 pp 指向编号最小的叶结点。同时我们维护每个结点的度数,方便我们知道在删除结点的时侯是否产生新的叶结点。操作如下:

  1. 删除 pp 指向的结点,并检查是否产生新的叶结点。

  2. 如果产生新的叶结点,假设编号为xx,我们比较 p,xp,x 的大小关系。如果 x>px>p,那么不做其他操作;否则就立刻删除 x,然后检查删除 x后是否产生新的叶结点,重复 2步骤,直到未产生新节点或者新节点的编号 >p

  3. 让指针 pp 自增直到遇到一个未被删除叶结点为止;

性质

循环上述操作 n-2 次,就完成了序列的构造。接下来考虑算法的正确性。

p 是当前编号最小的叶结点,若删除 p 后未产生叶结点,我们就只能去寻找下一个叶结点;若产生了叶结点 x

  • 如果 114514 、x>p,则反正 p 往后扫描都会扫到它,于是不做操作;

  • 如果 x<p,因为 p 原本就是编号最小的,而 xp 还小,所以 x 就是当前编号最小的叶结点,优先删除。删除 x 继续这样的考虑直到没有更小的叶结点。

算法复杂度分析,发现每条边最多被访问一次(在删度数的时侯),而指针最多遍历每个结点一次,因此复杂度是 O(n) 的。

实现5

标签:结点,删除,int,2996368,笔记,vector,leafs
From: https://www.cnblogs.com/Reply-/p/17567684.html

相关文章

  • [学习笔记]SQL server完全备份指南
    目录方式一,使用SQLServerManagementStudio准备工作收缩数据库移动数据库数据库备份还原数据库方式二,使用命令行工具准备工作收缩数据库移动数据库备份数据库还原数据库本文将介绍如何在日常项目中,对SQLserver数据库做备份和还原工作,SQLserver的备份......
  • PREDIV与PLLMUL配置应用笔记
    下图为CH32V305/307和CH32F205/207时钟树框图,在此,以CH32V307VCT6芯片,外置25MHz晶振为例,简述图中PREDIV与PLLMUL的配置方法,最终实现144MHz系统主频。外置晶振信号可直接输入PREDIV1与PLLMUL,也可先通过PREDIV2与PLL2MUL后,再输入PREDIV1与PLLMUL。当外置晶振频率为25MHz时,可先使用P......
  • 数据结构练习笔记——删除单链表中某区间的数
    删除单链表中某区间的数【问题描述】已知某带头结点的单链表中存放着若干整数,请删除该单链表中元素在[x,y]之间的所有结点,要求算法的时间复杂度为O(n),空间复杂度为O(1)。【输入形式】​ 第一行:单链表中元素个数m​ 第二行:单链表中的m个整数​ 第三行:要删除的元素值所在区......
  • Kubernetes亲和性学习笔记
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是欣宸在学习Kubernetes调度器的过程中,对亲和性相关知识点的整理和总结,这是一篇笔记性质的博客kubernetes默认调度器的调度过程:调度过程如下:预选(Pred......
  • git学习笔记——pull时与本地修改有冲突无法拉取
    在本地仓库的项目中修改代码后,若团队其他人也修改了代码,此时pull同步极有可能冲突失败强制使用远程仓库的修改覆盖本地修改#首先先远程下载最新的版本,但不合并先gitfetch--all#然后用刚刚下载的版本内容覆盖本地的内容gitreset--hardorigin/master......
  • JavaScript学习笔记01(包含ES6语法)
    Js简介什么是Js?Js最初被创建的目的是“使网页更生动”。Js写出来的程序被称为脚本,Js是一门脚本语言。被直接写在网页的HTML中,在页面加载的时候自动执行脚本被以纯文本的形式提供和执行,不需要特殊的准备或编译即可运行(JINcompiler)Js不仅可以在浏览器中执行,也可以......
  • 「学习笔记」自动机家族
    OI中所说的「自动机」一般都指「确定有限状态自动机」。一个确定有限状态自动机(DFA)由以下五部分构成:字符集(\(\Sigma\)),该自动机只能输入这些字符。状态集合(\(Q\))。如果把一个DFA看成一张有向图,那么DFA中的状态就相当于图上的顶点。起始状态(\(start\)),\(start\inQ\),是一......
  • K210笔记
    MaixPy文档K210学习笔记@嘉楠官网todo......
  • 「学习笔记」FHQ-treap
    FHQ-treap,即无旋treap,又称分裂合并treap,支持维护序列,可持久化等特性。FHQ-treap有两个核心操作,分裂与合并。通过这两个操作,在很多情况下可以比旋转treap等方便的实现一些操作。FHQ-treap与其他的平衡树相比,他最明显的优点是:它好写!!!,想象一下,在考场上,你用较短的时间写出FH......
  • python笔记:第十一章正则表达式
    1.模块re以一定规则,快速检索文本,或是实现一些替换操作默认下,区分大小写2.常见的匹配字符表字符描述\d代表任意数字,就是阿拉伯数字0-9这些\D代表非数字的字符。与\d完全相反\w代表字母,数字,下划线。也就是a-z、A-Z、0-9、_\W跟\w相反,代表不是字母......