首页 > 编程语言 >使用javascript求最小生成树

使用javascript求最小生成树

时间:2023-11-29 15:32:17浏览次数:38  
标签:parent graph javascript 最小 rank 生成 let result xroot

在JavaScript中,求取最小生成树(Minimum Spanning Tree, MST)最常用的算法是Prim算法和Kruskal算法。这里我将提供一个基于Kruskal算法的JavaScript实现。


首先,定义一个用于存储图的数据结构,这里使用JavaScript的类来实现:

class Graph {  

    constructor(vertices) {  

        this.V = vertices;  

        this.graph = [];  

    }  

  

    addEdge(u, v, w) {  

        this.graph.push([u, v, w]);  

    }  

  

    kruskalMST() {  

        let result = [];  

        this.graph = this.graph.sort((a, b) => a[2] - b[2]);  

        let parent = Array(this.V).fill(0);  

        let rank = Array(this.V).fill(0);  

        for (let i = 0; i < this.V; i++) {  

            parent[i] = i;  

            rank[i] = 0;  

        }  

        let e = 0;  

        for (let i = 0; i < this.graph.length; i++) {  

            let u = this.graph[i][0];  

            let v = this.graph[i][1];  

            let w = this.graph[i][2];  

            let x = this.find(parent, u);  

            let y = this.find(parent, v);  

            if (x !== y) {  

                e++;  

                result.push([u, v, w]);  

                this.union(parent, rank, x, y);  

            }  

        }  

        return result;  

    }  

  

    find(parent, i) {  

        if (parent[i] === i) {  

            return i;  

        }  

        return this.find(parent, parent[i]);  

    }  

  

    union(parent, rank, x, y) {  

        let xroot = this.find(parent, x);  

        let yroot = this.find(parent, y);  

        if (rank[xroot] < rank[yroot]) {  

            parent[xroot] = yroot;  

        } else if (rank[xroot] > rank[yroot]) {  

            parent[yroot] = xroot;  

        } else {  

            parent[yroot] = xroot;  

            rank[xroot]++;  

        }  

    }  

}

然后,你可以像下面这样使用这个类来创建一个图并求出其最小生成树:

let g = new Graph(4);  

g.addEdge(0, 1, 10);  

g.addEdge(0, 2, 6);  

g.addEdge(0, 3, 5);  

g.addEdge(1, 3, 15);  

g.addEdge(2, 3, 4);  

let result = g.kruskalMST();  

console.log("Edges in the constructed MST");  

for (let i = 0; i < result.length; i++) {  

    let u = result[i][0];  

    let v = result[i][1];  

    let weight = result[i][2];  

    console.log(`${u} -- ${v} == ${weight}`);  

}


标签:parent,graph,javascript,最小,rank,生成,let,result,xroot
From: https://blog.51cto.com/u_16393878/8617193

相关文章

  • JavaScript高级程序设计的代理与捕获——工作中的实际意义。
    js红宝书写得很好,很多东西都给你一一解释了,但是有一点我很想吐槽:没有在写代码例子之前说明,相关东西有啥用,在实际工作中有啥现实意义等等,导致很多人理解了概念和看懂了枯燥的代码段后却无法有效运用到自己的工作当中。因为你不知道拿来用到什么地方或者说什么情况下才去用它!举个我......
  • JavaScript编码风格指南
    sidebar:autosidebarDepth:4JavaScript编码风格指南内容出处:NicholasC.Zakas《编写可维护的JavaScript》GoogleJavaScriptStyleGuidecrockfordJSLintESLint好狗电影导航源文件基础命名文件名必须全部小写,并且可以包含下划线(_)或短划线(-),但不包含......
  • 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现
    2023-11-29:用go语言,给你一个字符串s,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小。要求不能打乱其他字符的相对位置)。输入:s="cbacdcbc"。输出:"acdb"。来自左程云。答案2023-11-29:所有的代码用灵捷3.5编写,感觉有点抽风了,生成的代码需要修改......
  • 检索增强生成 (RAG)的原理——传统检索+LLM生成相结合
    RAG是一种检索增强生成模型,由信息检索系统和seq2seq生成器组成。它的内部知识可以轻松地随时更改或补充,而无需浪费时间或算力重新训练整个模型。举个例子,假设你正在写一篇关于猫的文章,但你不确定如何描述猫的行为。你可以使用RAG来检索与猫行为相关的文档,然后将这些文档作为上下文......
  • 未出现的最小非负整数(MEX)
    典题合集前置芝士[Set做法]structMex{//自定义N的大小 intcnt[N];//cnt(i)表示数字i出现的次数 set<int>st;//记录未出现的数字 multiset<int>mulst;//记录出现过的数字 Mex(){ for(inti=0;i<N;++i)cnt[i]=0; for(inti=0;i<N;++i)st.insert(......
  • Python美丽图案生成方法
    使用samila库可以生成美丽的图案,例如:#pipinstallsamila==1.1orpip3installsamila==1.1importmatplotlib.pyplotaspltfromsamilaimportGenerativeImage#g=GenerativeImage()#g.generate()#g.plot()#plt.show()importrandomimportmathdeff1(x,......
  • vue3+vite 代码混淆插件 | JavaScript obfuscator
    安装插件yarnadd--devrollup-plugin-javascript-obfuscator创建obfuscator.js文件,把下面相应代码放入js文件中importobfuscatorPluginfrom'rollup-plugin-javascript-obfuscator';exportfunctioncodeObfuscatorPlugin(isBuild){if(!isBuild){return[];}......
  • C++ 图论之次最小生成树
    1.前言生成树指在无向图中找一棵包含图中的所有节点的树,此树是含有图中所有顶点的无环连通子图。对所有生成树边上的权重求和,权重和最小的树为最小生成树,次小的为次最小生成树。最小生成树和次最小生成树的应用领域都较广泛。也是图论中优为重要的研究对象,求解算法也是常规必须......
  • JavaScript 的基本规范
    在平常项目开发中,我们遵守一些这样的基本规范,比如说:(1)一个函数作用域中所有的变量声明应该尽量提到函数首部,用一个var声明,不允许出现两个连续的var声明,声明时  如果变量没有值,应该给该变量赋值对应类型的初始值,便于他人阅读代码时,能够一目了然的知道变量对应的类型值。(2)......
  • java-生成二维码/条形码
    前言:  需求:生成二维码/条形码//使用ZXing库<dependencies><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency>&l......