Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const readLine = require('readline');
- const reader = readLine.createInterface({input: process.stdin});
- const MESSAGE_OOPS = 'Oops! I did it again';
- let inputLines = [];
- let currentLine = 0;
- let numberVertices = 0;
- let numberEdges = 0;
- let source = 0;
- let target = 0;
- let weight = 0;
- let edges = [];
- reader.on('line', line => inputLines.push(line))
- process.stdin.on('end', solve);
- function solve() {
- for (const line of inputLines) {
- if (currentLine === 0) {
- [numberVertices, numberEdges] = line.split(' ');
- numberVertices = numberVertices*1;
- numberEdges = numberEdges*1;
- } else {
- if (currentLine <= numberVertices) {
- [source, target, weight] = line.split(' ');
- edges.push([(source-1), (target-1), weight*1]);
- }
- }
- currentLine++;
- }
- console.log(kruskalMaxMst(numberVertices, edges));
- }
- // возвратить идентификатор множества, которому принадлежит элемент
- function find(parent, vertex) {
- if (parent[vertex] != vertex) {
- parent[vertex] = find(parent, parent[vertex]);
- }
- return Number(parent[vertex]);
- }
- function union(parent, rank, root1, root2) {
- if (Number(rank[root1]) > Number(rank[root2])) {
- parent[root2] = Number(root1);
- } else if (Number(rank[root1]) < Number(rank[root2])) {
- parent[root1] = Number(root2);
- } else {
- parent[root2] = Number(root1);
- rank[root1] += 1;
- }
- }
- function kruskalMaxMst(n, edges) {
- edges.sort((a, b) => b[2] - a[2]); // DESC by weight
- const parent = Array.from({ length: n }, (_, i) => i);
- const rank = new Array(n).fill(0);
- let maxMstWeight = 0;
- for (const [u, v, weight] of edges) {
- const rootU = find(parent, u);
- const rootV = find(parent, v);
- if (rootU != rootV) {
- union(parent, rank, rootU, rootV);
- maxMstWeight += weight;
- }
- }
- let components = new Set();
- for (let i = 0; i < n; i++) {
- let q = find(parent, i);
- components.add(q);
- }
- if (components.size >= 2) {
- return MESSAGE_OOPS;
- }
- return maxMstWeight;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement