структура данных графа в узле js - PullRequest
0 голосов
/ 10 июня 2019

обновление 1:

Я нашел пример BFS здесь https://medium.com/basecs/breaking-down-breadth-first-search-cebe696709d9,, но я получаю ошибку TypeError: Cannot read property 'left' of undefined.Можете ли вы сказать мне, как это исправить

function roadsAndLibraries(n, c_lib, c_road, cities) {
    console.log("roadsAndLibraries n--->", n);
    console.log("roadsAndLibraries c_lib--->", c_lib);
    console.log("roadsAndLibraries c_road--->", c_road);
    console.log("roadsAndLibraries cities--->", cities);
    var m = new Map();
    m.set('a', 2);
    m.set('b', 3);
    m.set('b', 3);
    m.set('b', 2);
    m.set('b', 1);

    console.log("map value--->", m);
        // Check that a root node exists.

    // if (rootNode === null) {
    //     return;
    // }

    // Check that a root node exists.
    if (n === null) {
        console.log("n root node--->", n);
        return;
    }

    // Create our queue and push our root node into it.
    // var queue = [];
    // queue.push(rootNode);

    // Create our queue and push our root node into it.
    var queue = [];
    queue.push(n);

    console.log(" queue.push--->", queue);


    while (queue.length > 0) {
        // Create a reference to currentNode, at the top of the queue.
        var currentNode = queue[0];

        // If currentNode has a left child node, add it to the queue.
        if (currentNode.left !== null) {
            queue.push(currentNode.left)
        }
        // If currentNode has a right child node, add it to the queue.
        if (currentNode.right !== null) {
            queue.push(currentNode.right)
        }
        // Remove the currentNode from the queue.
        queue.shift()
    }




}
  • Я пытаюсь решить проблему структуры данных графа хакерского ранга.
  • Мой метод должен возвращать минимальную стоимость предоставления библиотек дляall.
  • Предоставив здесь мой вопрос о ранжировании хакера https://www.hackerrank.com/challenges/torque-and-development/problem?h_l=interview&playlist_slugs%5B%5D%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D%5B%5D=graphs&isFullScreen=true

  • Я отладил уже существующий код и обнаружил из примера ввода следующие значения печатают 2 3 3 2 1

  • , но не уверен, как распечатать остальные значения и как получить пример выходного сигнала.
  • Я начал использовать метод Map, но не уверен, как подключить города дальше, если мне нужноиспользовать BFS или DFS
  • , если мне нужно получить все вводные данные.
  • Я посмотрел этот учебник и понял концепции, но все еще не смог продолжить https://medium.com/@ziyoshams/graphs-in-javascript-cc0ed170b156

  • Предоставление моего отлаженного кода и отладочного вывода ниже

графического кода

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.replace(/\s*$/, '')
        .split('\n')
        .map(str => str.replace(/\s*$/, ''));

    main();
});

function readLine() {
    return inputString[currentLine++];
}

// Complete the roadsAndLibraries function below.
function roadsAndLibraries(n, c_lib, c_road, cities) {
    console.log("roadsAndLibraries n--->", n);
    console.log("roadsAndLibraries c_lib--->", c_lib);
    console.log("roadsAndLibraries c_road--->", c_road);
    console.log("roadsAndLibraries cities--->", cities);

var m = new Map();
    m.set('a', 2);
    m.set('b', 3);
    m.set('b', 3);
    m.set('b', 2);
    m.set('b', 1);

    console.log("map value--->", m);





}

function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
    console.log("ws--->", ws);


    const q = parseInt(readLine(), 10);
    console.log("q--->", q);

    for (let qItr = 0; qItr < q; qItr++) {
        const nmC_libC_road = readLine().split(' ');
        console.log("nmC_libC_road--->", nmC_libC_road);

        const n = parseInt(nmC_libC_road[0], 10);
        console.log("n--->", n);


        const m = parseInt(nmC_libC_road[1], 10);
        console.log("m--->", m);

        const c_lib = parseInt(nmC_libC_road[2], 10);
        console.log("c_lib--->", c_lib);

        const c_road = parseInt(nmC_libC_road[3], 10);
        console.log("c_road--->", c_road);

        let cities = Array(m);
        console.log("cities--->", cities);

        for (let i = 0; i < m; i++) {
            cities[i] = readLine().split(' ').map(citiesTemp => parseInt(citiesTemp, 10));
        }

        const result = roadsAndLibraries(n, c_lib, c_road, cities);
        console.log("result--->", result);

        ws.write(result + '\n');
    }

    ws.end();
}

пример вывода

ws---> WriteStream {
  _writableState:
   WritableState {
     objectMode: false,
     highWaterMark: 16384,
     finalCalled: false,
     needDrain: false,
     ending: false,
     ended: false,
     finished: false,
     destroyed: false,
     decodeStrings: true,
     defaultEncoding: 'utf8',
     length: 0,
     writing: false,
     corked: 0,
     sync: true,
     bufferProcessing: false,
     onwrite: [Function: bound onwrite],
     writecb: null,
     writelen: 0,
     bufferedRequest: null,
     lastBufferedRequest: null,
     pendingcb: 0,
     prefinished: false,
     errorEmitted: false,
     emitClose: false,
     bufferedRequestCount: 0,
     corkedRequestsFree:
      { next: null,
        entry: null,
        finish: [Function: bound onCorkedFinish] } },
  writable: true,
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  path:
   '/tmp/submission/20190610/18/32/hackerrank-e7eb8e7be2993c28875aad2bbb8d6292/0.userout',
  fd: null,
  flags: 'w',
  mode: 438,
  start: undefined,
  autoClose: true,
  pos: undefined,
  bytesWritten: 0,
  closed: false }
q---> 2
nmC_libC_road---> [ '3', '3', '2', '1' ]
n---> 3
m---> 3
c_lib---> 2
c_road---> 1
cities---> [ <3 empty items> ]
roadsAndLibraries n---> 3
roadsAndLibraries c_lib---> 2
roadsAndLibraries c_road---> 1
roadsAndLibraries cities---> [ [ 1, 2 ], [ 3, 1 ], [ 2, 3 ] ]
result---> undefined
nmC_libC_road---> [ '6', '6', '2', '5' ]
n---> 6
m---> 6
c_lib---> 2
c_road---> 5
cities---> [ <6 empty items> ]
roadsAndLibraries n---> 6
roadsAndLibraries c_lib---> 2
roadsAndLibraries c_road---> 5
roadsAndLibraries cities---> [ [ 1, 3 ], [ 3, 4 ], [ 2, 4 ], [ 1, 2 ], [ 2, 3 ], [ 5, 6 ] ]
result---> undefined

1 Ответ

0 голосов
/ 25 июня 2019

Мне кажется, что у вас проблемы с пониманием проблемы.Я постараюсь обобщить это и указать на несколько вещей, которые необходимо учитывать.

График города

Вам дан график, где каждый узел является городом, а край - двунаправленной дорогой между двумя городами.Это означает, что вы имеете дело с неориентированным графиком, то есть, если между городами A и B есть грань (= дорога), вы можете путешествовать из A в B и из B в A. Конечно, вы можете представлятьэто с точки зрения ориентированного графа путем создания двух ребер для каждой дороги: одного от А до В и одного от В до А. Но я не думаю, что это необходимо.

Теперь вы хотите, чтобы в каждом городе была либо библиотека, либо путь к городу с библиотекой.Вы понимаете, что если у вас есть два набора городов, которые не связаны какой-либо дорогой, вам потребуется как минимум одна библиотека для каждого из этих наборов.Такие наборы городов называются связными компонентами графа .Вам нужно будет определить эти компоненты.Они будут частью проблемы, которая должна решаться независимо.

Стоимость доступа к библиотеке

Вторая информация, которую вам дают, это стоимость восстановления библиотеки в городе и стоимость ремонта дороги.Поскольку вы пытаетесь минимизировать общую стоимость, это означает, что вы пытаетесь восстановить как можно меньше дорог и как можно меньше библиотек.

Вы понимаете, что , если стоимость восстановления библиотеки меньше или равна стоимости строительства дороги , более дешевый вариант - построить библиотеку в каждом городе.

В других случаях решение довольно простое, но не так легко увидеть.Давайте рассмотрим один подключенный компонент.Для товара предположим, что города A, B, C и D являются узлами этого связанного компонента.

A----B
|    |
C----D

Вы уже знаете, что вам нужно будет разместить хотя бы одну библиотеку в одном из городов.Давайте разместим библиотеку в городе А. Тогда, когда мы находимся в связанном компоненте, у А есть несколько дорог (минимум одна, максимум 3), которые идут в другие города.Для городов, у которых есть дорога, которая соединяет их с городом А, дешевле восстановить дорогу, чем построить новую библиотеку.Поэтому мы решили восстановить дорогу.Теперь город A и соседи A (города B и D) могут получить доступ к библиотеке.Затем среди соседей A (города B и C) будут дороги в города, которые еще не имеют доступа к библиотеке.В этом случае у обоих C и B есть дорога к D. Нам понадобится только одна дорога, чтобы соединить D с библиотекой в ​​A. Опять же, дешевле построить дорогу в город, который может получить доступ к библиотеке, чем строитьновая библиотека.

Алгоритм

Предыдущий метод постепенного соединения городов путем распространения на всех соседей первого узла, затем соседей соседей первых узлов (рекурсивно)BFS.В качестве бонуса алгоритм BFS подходит для поиска связанных компонентов графа.

Если вы поняли предыдущие объяснения, я думаю, что вы в состоянии решить проблему.Вы можете запустить алгоритм BFS на графике.Когда вы запускаете алгоритм, считайте 1 библиотеку, а затем 1 дорогу при каждом подключении к новому городу.Когда вы закончите алгоритм BFS, но на графике все еще есть города, которые вы еще не посетили, подсчитайте дополнительную библиотеку и снова используйте BFS, начиная с города, который вы еще не исследовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...