Find a path from s to t using as few red nodes as possible












2












$begingroup$


Was doing a little interview prep. Given an undirected graph G, such that each node is colored red or blue and |E|≥|V|, find a path in O(|E|) time such that starting and ending at 2 blue nodes, s and t, that you pass through as few red nodes as possible.



Initial Impressions: Since |E|≥|V|, O(|E|) time would include O(|E|+|V|), which means the solution likely uses BFS or DFS. Modifying the graph such that causing the all red nodes must be forced down a directed path of some long length (after making the whole graph directed) in order to use out-of-the-box BFS seems not viable, as it would mean constructing a new graph would be along O(|E||V|) time.



Another method I toyed around with was propagating values to nodes based on the safest path to that node while doing a DFS search, but not all values were guaranteed to update.



I still want to try to solve this myself, but I'm really stuck right now. Was wondering if there were any hints I could get. There are much simpler ways of doing this if it weren't for the O(|E|) time. Djikstras with creating some edge weights would work, but wouldn't be within the time bound.










share|cite|improve this question









$endgroup$








  • 1




    $begingroup$
    Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
    $endgroup$
    – Yuval Filmus
    2 hours ago
















2












$begingroup$


Was doing a little interview prep. Given an undirected graph G, such that each node is colored red or blue and |E|≥|V|, find a path in O(|E|) time such that starting and ending at 2 blue nodes, s and t, that you pass through as few red nodes as possible.



Initial Impressions: Since |E|≥|V|, O(|E|) time would include O(|E|+|V|), which means the solution likely uses BFS or DFS. Modifying the graph such that causing the all red nodes must be forced down a directed path of some long length (after making the whole graph directed) in order to use out-of-the-box BFS seems not viable, as it would mean constructing a new graph would be along O(|E||V|) time.



Another method I toyed around with was propagating values to nodes based on the safest path to that node while doing a DFS search, but not all values were guaranteed to update.



I still want to try to solve this myself, but I'm really stuck right now. Was wondering if there were any hints I could get. There are much simpler ways of doing this if it weren't for the O(|E|) time. Djikstras with creating some edge weights would work, but wouldn't be within the time bound.










share|cite|improve this question









$endgroup$








  • 1




    $begingroup$
    Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
    $endgroup$
    – Yuval Filmus
    2 hours ago














2












2








2





$begingroup$


Was doing a little interview prep. Given an undirected graph G, such that each node is colored red or blue and |E|≥|V|, find a path in O(|E|) time such that starting and ending at 2 blue nodes, s and t, that you pass through as few red nodes as possible.



Initial Impressions: Since |E|≥|V|, O(|E|) time would include O(|E|+|V|), which means the solution likely uses BFS or DFS. Modifying the graph such that causing the all red nodes must be forced down a directed path of some long length (after making the whole graph directed) in order to use out-of-the-box BFS seems not viable, as it would mean constructing a new graph would be along O(|E||V|) time.



Another method I toyed around with was propagating values to nodes based on the safest path to that node while doing a DFS search, but not all values were guaranteed to update.



I still want to try to solve this myself, but I'm really stuck right now. Was wondering if there were any hints I could get. There are much simpler ways of doing this if it weren't for the O(|E|) time. Djikstras with creating some edge weights would work, but wouldn't be within the time bound.










share|cite|improve this question









$endgroup$




Was doing a little interview prep. Given an undirected graph G, such that each node is colored red or blue and |E|≥|V|, find a path in O(|E|) time such that starting and ending at 2 blue nodes, s and t, that you pass through as few red nodes as possible.



Initial Impressions: Since |E|≥|V|, O(|E|) time would include O(|E|+|V|), which means the solution likely uses BFS or DFS. Modifying the graph such that causing the all red nodes must be forced down a directed path of some long length (after making the whole graph directed) in order to use out-of-the-box BFS seems not viable, as it would mean constructing a new graph would be along O(|E||V|) time.



Another method I toyed around with was propagating values to nodes based on the safest path to that node while doing a DFS search, but not all values were guaranteed to update.



I still want to try to solve this myself, but I'm really stuck right now. Was wondering if there were any hints I could get. There are much simpler ways of doing this if it weren't for the O(|E|) time. Djikstras with creating some edge weights would work, but wouldn't be within the time bound.







graphs






share|cite|improve this question













share|cite|improve this question











share|cite|improve this question




share|cite|improve this question










asked 5 hours ago









Hunter DyerHunter Dyer

284




284








  • 1




    $begingroup$
    Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
    $endgroup$
    – Yuval Filmus
    2 hours ago














  • 1




    $begingroup$
    Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
    $endgroup$
    – Yuval Filmus
    2 hours ago








1




1




$begingroup$
Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
$endgroup$
– Yuval Filmus
2 hours ago




$begingroup$
Try a variant of BFS in which you first find all red nodes reachable only via blue nodes, and so on.
$endgroup$
– Yuval Filmus
2 hours ago










2 Answers
2






active

oldest

votes


















2












$begingroup$

To solve this, you need to use $BFS$. But first, manipulate $G$ so that the path will always favor blue vertices.



The solution has 2 parts:




  1. Use $DFS$ on blue vertices only, to find all all-blue strongly connected components, or $SCC$. Let's denote each $SCC$ by $v'$. Now, each blue $v in v'$ will be "compressed" to a single vertex $u$, and an edge $(u,x)$ will be added for every $x in N(v')$.
    Note any such $x$ is necessarily red.
    This step costs $O(V+E) = O(E)$, since $DFS$ is $O(V+E)$, and you have at most $V$ blue vertices, which make no more than $E$ new edges to add.


Step 1 means all paths that are blue-only will be free. On the new graph, the $BFS$ will only consider the edges which pass through a red vertice.




  1. Use $BFS$ from $s$. That length of the path to $t$ will essentially be the shortest path under the constraint of least red vertices in the path.






share|cite|improve this answer









$endgroup$





















    1












    $begingroup$

    Convert $G$ to a directed graph $G'$ where we have two edges $(u,v)$ and $(v,u)$ in $G'$ for every edge ${u,v}$ in $G$. Let the length of $(u,v)$ be 1 if $v$ is a red node and 0 otherwise. Now run Dijkstra's algorithm on $G'$ from the starting node $s$ to the ending node $t$.



    It is clear that the shortest path thus found passes as few red nodes as possible.






    share|cite|improve this answer









    $endgroup$













    • $begingroup$
      Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
      $endgroup$
      – Hunter Dyer
      40 mins ago










    • $begingroup$
      I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
      $endgroup$
      – Apass.Jack
      26 mins ago












    • $begingroup$
      Although it is intuitively clear, it takes some time to explain it clearly.
      $endgroup$
      – Apass.Jack
      3 mins ago














    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
    });
    });
    }, "mathjax-editing");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "419"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcs.stackexchange.com%2fquestions%2f106337%2ffind-a-path-from-s-to-t-using-as-few-red-nodes-as-possible%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2












    $begingroup$

    To solve this, you need to use $BFS$. But first, manipulate $G$ so that the path will always favor blue vertices.



    The solution has 2 parts:




    1. Use $DFS$ on blue vertices only, to find all all-blue strongly connected components, or $SCC$. Let's denote each $SCC$ by $v'$. Now, each blue $v in v'$ will be "compressed" to a single vertex $u$, and an edge $(u,x)$ will be added for every $x in N(v')$.
      Note any such $x$ is necessarily red.
      This step costs $O(V+E) = O(E)$, since $DFS$ is $O(V+E)$, and you have at most $V$ blue vertices, which make no more than $E$ new edges to add.


    Step 1 means all paths that are blue-only will be free. On the new graph, the $BFS$ will only consider the edges which pass through a red vertice.




    1. Use $BFS$ from $s$. That length of the path to $t$ will essentially be the shortest path under the constraint of least red vertices in the path.






    share|cite|improve this answer









    $endgroup$


















      2












      $begingroup$

      To solve this, you need to use $BFS$. But first, manipulate $G$ so that the path will always favor blue vertices.



      The solution has 2 parts:




      1. Use $DFS$ on blue vertices only, to find all all-blue strongly connected components, or $SCC$. Let's denote each $SCC$ by $v'$. Now, each blue $v in v'$ will be "compressed" to a single vertex $u$, and an edge $(u,x)$ will be added for every $x in N(v')$.
        Note any such $x$ is necessarily red.
        This step costs $O(V+E) = O(E)$, since $DFS$ is $O(V+E)$, and you have at most $V$ blue vertices, which make no more than $E$ new edges to add.


      Step 1 means all paths that are blue-only will be free. On the new graph, the $BFS$ will only consider the edges which pass through a red vertice.




      1. Use $BFS$ from $s$. That length of the path to $t$ will essentially be the shortest path under the constraint of least red vertices in the path.






      share|cite|improve this answer









      $endgroup$
















        2












        2








        2





        $begingroup$

        To solve this, you need to use $BFS$. But first, manipulate $G$ so that the path will always favor blue vertices.



        The solution has 2 parts:




        1. Use $DFS$ on blue vertices only, to find all all-blue strongly connected components, or $SCC$. Let's denote each $SCC$ by $v'$. Now, each blue $v in v'$ will be "compressed" to a single vertex $u$, and an edge $(u,x)$ will be added for every $x in N(v')$.
          Note any such $x$ is necessarily red.
          This step costs $O(V+E) = O(E)$, since $DFS$ is $O(V+E)$, and you have at most $V$ blue vertices, which make no more than $E$ new edges to add.


        Step 1 means all paths that are blue-only will be free. On the new graph, the $BFS$ will only consider the edges which pass through a red vertice.




        1. Use $BFS$ from $s$. That length of the path to $t$ will essentially be the shortest path under the constraint of least red vertices in the path.






        share|cite|improve this answer









        $endgroup$



        To solve this, you need to use $BFS$. But first, manipulate $G$ so that the path will always favor blue vertices.



        The solution has 2 parts:




        1. Use $DFS$ on blue vertices only, to find all all-blue strongly connected components, or $SCC$. Let's denote each $SCC$ by $v'$. Now, each blue $v in v'$ will be "compressed" to a single vertex $u$, and an edge $(u,x)$ will be added for every $x in N(v')$.
          Note any such $x$ is necessarily red.
          This step costs $O(V+E) = O(E)$, since $DFS$ is $O(V+E)$, and you have at most $V$ blue vertices, which make no more than $E$ new edges to add.


        Step 1 means all paths that are blue-only will be free. On the new graph, the $BFS$ will only consider the edges which pass through a red vertice.




        1. Use $BFS$ from $s$. That length of the path to $t$ will essentially be the shortest path under the constraint of least red vertices in the path.







        share|cite|improve this answer












        share|cite|improve this answer



        share|cite|improve this answer










        answered 2 hours ago









        loxlox

        1666




        1666























            1












            $begingroup$

            Convert $G$ to a directed graph $G'$ where we have two edges $(u,v)$ and $(v,u)$ in $G'$ for every edge ${u,v}$ in $G$. Let the length of $(u,v)$ be 1 if $v$ is a red node and 0 otherwise. Now run Dijkstra's algorithm on $G'$ from the starting node $s$ to the ending node $t$.



            It is clear that the shortest path thus found passes as few red nodes as possible.






            share|cite|improve this answer









            $endgroup$













            • $begingroup$
              Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
              $endgroup$
              – Hunter Dyer
              40 mins ago










            • $begingroup$
              I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
              $endgroup$
              – Apass.Jack
              26 mins ago












            • $begingroup$
              Although it is intuitively clear, it takes some time to explain it clearly.
              $endgroup$
              – Apass.Jack
              3 mins ago


















            1












            $begingroup$

            Convert $G$ to a directed graph $G'$ where we have two edges $(u,v)$ and $(v,u)$ in $G'$ for every edge ${u,v}$ in $G$. Let the length of $(u,v)$ be 1 if $v$ is a red node and 0 otherwise. Now run Dijkstra's algorithm on $G'$ from the starting node $s$ to the ending node $t$.



            It is clear that the shortest path thus found passes as few red nodes as possible.






            share|cite|improve this answer









            $endgroup$













            • $begingroup$
              Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
              $endgroup$
              – Hunter Dyer
              40 mins ago










            • $begingroup$
              I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
              $endgroup$
              – Apass.Jack
              26 mins ago












            • $begingroup$
              Although it is intuitively clear, it takes some time to explain it clearly.
              $endgroup$
              – Apass.Jack
              3 mins ago
















            1












            1








            1





            $begingroup$

            Convert $G$ to a directed graph $G'$ where we have two edges $(u,v)$ and $(v,u)$ in $G'$ for every edge ${u,v}$ in $G$. Let the length of $(u,v)$ be 1 if $v$ is a red node and 0 otherwise. Now run Dijkstra's algorithm on $G'$ from the starting node $s$ to the ending node $t$.



            It is clear that the shortest path thus found passes as few red nodes as possible.






            share|cite|improve this answer









            $endgroup$



            Convert $G$ to a directed graph $G'$ where we have two edges $(u,v)$ and $(v,u)$ in $G'$ for every edge ${u,v}$ in $G$. Let the length of $(u,v)$ be 1 if $v$ is a red node and 0 otherwise. Now run Dijkstra's algorithm on $G'$ from the starting node $s$ to the ending node $t$.



            It is clear that the shortest path thus found passes as few red nodes as possible.







            share|cite|improve this answer












            share|cite|improve this answer



            share|cite|improve this answer










            answered 53 mins ago









            Apass.JackApass.Jack

            13.7k1940




            13.7k1940












            • $begingroup$
              Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
              $endgroup$
              – Hunter Dyer
              40 mins ago










            • $begingroup$
              I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
              $endgroup$
              – Apass.Jack
              26 mins ago












            • $begingroup$
              Although it is intuitively clear, it takes some time to explain it clearly.
              $endgroup$
              – Apass.Jack
              3 mins ago




















            • $begingroup$
              Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
              $endgroup$
              – Hunter Dyer
              40 mins ago










            • $begingroup$
              I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
              $endgroup$
              – Apass.Jack
              26 mins ago












            • $begingroup$
              Although it is intuitively clear, it takes some time to explain it clearly.
              $endgroup$
              – Apass.Jack
              3 mins ago


















            $begingroup$
            Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
            $endgroup$
            – Hunter Dyer
            40 mins ago




            $begingroup$
            Yeah that definitely works, but the runtime of Dijkstra's is O(|E| + |V|log|V|) which is more than O(|E|).
            $endgroup$
            – Hunter Dyer
            40 mins ago












            $begingroup$
            I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
            $endgroup$
            – Apass.Jack
            26 mins ago






            $begingroup$
            I will show shortly that this particular run of Dijkstra's algorithm actually takes $O(|E|)$ time.
            $endgroup$
            – Apass.Jack
            26 mins ago














            $begingroup$
            Although it is intuitively clear, it takes some time to explain it clearly.
            $endgroup$
            – Apass.Jack
            3 mins ago






            $begingroup$
            Although it is intuitively clear, it takes some time to explain it clearly.
            $endgroup$
            – Apass.Jack
            3 mins ago




















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Computer Science Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcs.stackexchange.com%2fquestions%2f106337%2ffind-a-path-from-s-to-t-using-as-few-red-nodes-as-possible%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Why is a white electrical wire connected to 2 black wires?

            Waikiki

            What are all the squawk codes?