首页 > 编程语言 >朱刘算法学习笔记

朱刘算法学习笔记

时间:2023-01-01 20:35:19浏览次数:43  
标签:pre tn 笔记 学习 算法 && root id

一句话概括:

朱刘算法就是最小生成树算法在有向图中的应用。

树形图:

  • 无环

  • 除了根以外,每个点的入度为1

最小树形图:一个有向图,存在从某个点开始的到达所有的的一个最小生成树。

核心思想:贪心

时间复杂度:\(O(nm)\)

算法步骤:

  1. 对于每个点(除根以外),选择它入边中边权最小的那条边。

  2. 如果没有环,算法终止;否则进行缩环并更新其他点到环的距离。

  3. 将所有环缩点,得到新图\(h'\)

code

bool zhu_liu() {
  ans = 0;
  int u, v, root = 0;
  for (;;) {
    f(i, 0, n) in[i] = 1e100;
    f(i, 0, m) {
      u = e[i].s;
      v = e[i].t;
      if (u != v && e[i].w < in[v]) {
        in[v] = e[i].w;
        pre[v] = u;
      }
    }
    f(i, 0, m) if (i != root && in[i] > 1e50) return 0;
    int tn = 0;
    memset(id, -1, sizeof id);
    memset(vis, -1, sizeof vis);
    in[root] = 0;
    f(i, 0, n) {
      ans += in[i];
      v = i;
      while (vis[v] != i && id[v] == -1 && v != root) {
        vis[v] = i;
        v = pre[v];
      }
      if (v != root && id[v] == -1) {
        for (int u = pre[v]; u != v; u = pre[u]) id[u] = tn;
        id[v] = tn++;
      }
    }
    if (tn == 0) break;
    f(i, 0, n) if (id[i] == -1) id[i] = tn++;
    f(i, 0, m) {
      u = e[i].s;
      v = e[i].t;
      e[i].s = id[u];
      e[i].t = id[v];
      if (e[i].s != e[i].t) e[i].w -= in[v];
    }
    n = tn;
    root = id[root];
  }
  return ans;
}

标签:pre,tn,笔记,学习,算法,&&,root,id
From: https://www.cnblogs.com/sunruize/p/17018534.html

相关文章

  • 文件包含学习笔记
    文件包含原理include()include_once()require()require_once()include()和require()的区别:require()如果在包含过程中出错,就会直接退出,不执行后续语句include(......
  • 算法之链式前向星存图
    蒟蒻们往这里看!链式前向星存图的讲解先上代码://MAXN指的是最大边数//MAXM指的是最大节点数intcnt;inthead[MAXM];//head[n]指的是第n个节点存储的最后一条边地址......
  • AC自动机学习笔记
    一句话概括:\(AC\)自动机\(=Trie+Kmp\)算法复习\(Trie\)字典树,顾名思义,是一个字典一样的树,结构非常简单,不再赘述。codeintson[N][26],cnt[N],idx;voidinser......
  • 2-SAT学习笔记
    \(SAT:satisfaction\)\(SAT\)问题:若干问题\(x_1,x_2,...,x_n\),另有\(m\)个需要满足条件,其中每个命题为真或假,求\(x_1,x_2,...,x_n\)的一种取值。一般\(k-SAT\)问......
  • 我的第一天学习-HelloWorld详解
    HelloWorld详解1.随便新建一个文件夹存放代码2.新建一个Java文件文件后缀名为.javaHello.java[注意]系统可能没有显示文件后缀名,需要我们手动打开,在文件查看中......
  • 狂神说Java(零基础)预科班笔记
    前言​以下笔记是根据B站up主遇见狂神说的Java零基础学习视频整理而成,视频链接点这里跳转(狂神说系列Java零基础版)。由于本人推崇费曼学习法,不想要写完一篇笔记之后就直......
  • 动手深度学习系列笔记
    动手学深度学习在线课程此系列文章为听课所敲代码+笔记,使用jupyternotebook展现目录​​3月20日​​​​3月21日​​​​3月27日​​​​3月28日​​​​4月10日​​​​4......
  • 【树模型与集成学习】(task6)梯度提升树GBDT+LR
    学习总结(1)不同问题的提升树学习算法,主要区别在于使用的损失函数不同,如用平方误差损失函数的回归问题、用指数损失函数的分类问题、用一般损失函数的一般决策问题等。(2)不管......
  • 操作系统OS笔记目录(清华大学)
    简介不得不说想自学学操作系统,清华大学慕课是个不错的选择,但难度比较大,特别是想把慕课的实验部分内容也完成的话。不过如果能把它的实验部分也完成的话,相信你会对操作系统......
  • 每日算法之删除链表中重复的结点
    JZ76删除链表中重复的结点题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5处理后为......