Dada una gráfica de N Nodes, E aristas, un Node X y una distancia K . La tarea es imprimir todos los Nodes dentro de la distancia K de X.
Aporte:
Salida: 4 5 2 7 3
Los Nodes vecinos dentro de la distancia 2 del Node 4 son: 4 5 2 7 3
Aproximación:
Para imprimir todos los Nodes que se encuentren a una distancia K o inferior a K . Podemos hacerlo aplicando la variación dfs , que toma el Node K desde donde tenemos que imprimir la distancia hasta la distancia K.
dfs(K, node, -1, tree)
Aquí -1 indica el padre del Node.
Esta función recursiva básicamente imprime el Node y luego llama al dfs(K-1, vecino del Node, Node, árbol) .
La condición base es K>0.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to print // the nearest K neighbour // nodes (including itself) #include <bits/stdc++.h> using namespace std; // Structure of an edge struct arr { int from, to; }; // Recursive function to print // the neighbor nodes of a node // until K distance void dfs(int k, int node, int parent, const vector<vector<int> >& tree) { // Base condition if (k < 0) return; // Print the node cout << node << ' '; // Traverse the connected // nodes/adjacency list for (int i : tree[node]) { if (i != parent) { // node i becomes the parent // of its child node dfs(k - 1, i, node, tree); } } } // Function to print nodes under // distance k void print_under_dis_K(struct arr graph[], int node, int k, int v, int e) { // To make graph with // the given edges vector<vector<int> > tree(v + 1, vector<int>()); for (int i = 0; i < e; i++) { int from = graph[i].from; int to = graph[i].to; tree[from].push_back(to); tree[to].push_back(from); } dfs(k, node, -1, tree); } // Driver Code int main() { // Number of vertex and edges int v = 7, e = 6; // Given edges struct arr graph[v + 1] = { { 2, 1 }, { 2, 5 }, { 5, 4 }, { 5, 7 }, { 4, 3 }, { 7, 6 } }; // k is the required distance // upto which are neighbor // nodes should get printed int node = 4, k = 2; // function calling print_under_dis_K(graph, node, k, v, e); return 0; }
Java
// Java program to print // the nearest K neighbour // nodes (including itself) import java.util.*; @SuppressWarnings("unchecked") class GFG{ // Structure of an edge public static class arr { public int from, to; public arr(int from, int to) { this.from = from; this.to = to; } }; // Recursive function to print // the neighbor nodes of a node // until K distance static void dfs(int k, int node, int parent, ArrayList []tree) { // Base condition if (k < 0) return; // Print the node System.out.print(node + " "); ArrayList tmp = (ArrayList)tree[node]; // Traverse the connected // nodes/adjacency list for(int i : (ArrayList<Integer>)tmp) { if (i != parent) { // Node i becomes the parent // of its child node dfs(k - 1, i, node, tree); } } } // Function to print nodes under // distance k static void print_under_dis_K(arr []graph, int node, int k, int v, int e) { // To make graph with // the given edges ArrayList []tree = new ArrayList[v + 1]; for(int i = 0; i < v + 1; i++) { tree[i] = new ArrayList(); } for(int i = 0; i < e; i++) { int from = graph[i].from; int to = graph[i].to; tree[from].add(to); tree[to].add(from); } dfs(k, node, -1, tree); } // Driver Code public static void main(String[] args) { // Number of vertex and edges int v = 7, e = 6; // Given edges arr []graph = { new arr(2, 1), new arr(2, 5), new arr(5, 4), new arr(5, 7), new arr(4, 3), new arr(7, 6) }; // k is the required distance // upto which are neighbor // nodes should get printed int node = 4, k = 2; // Function calling print_under_dis_K(graph, node, k, v, e); } } // This code is contributed by pratham76
Python3
# Python3 program to print # the nearest K neighbour # nodes (including itself) tree = [[] for i in range(100)] # Recursive function to print # the neighbor nodes of a node # until K distance def dfs(k, node, parent): # Base condition if (k < 0): return # Print the node print(node, end = " ") # Traverse the connected # nodes/adjacency list for i in tree[node]: if (i != parent): # node i becomes the parent # of its child node dfs(k - 1, i, node) # Function to print nodes under # distance k def print_under_dis_K(graph, node, k, v, e): for i in range(e): fro = graph[i][0] to = graph[i][1] tree[fro].append(to) tree[to].append(fro) dfs(k, node, -1) # Driver Code # Number of vertex and edges v = 7 e = 6 # Given edges graph = [[ 2, 1 ], [ 2, 5 ], [ 5, 4 ], [ 5, 7 ], [ 4, 3 ], [ 7, 6 ]] # k is the required distance # upto which are neighbor # nodes should get pred node = 4 k = 2 # function calling print_under_dis_K(graph, node, k, v, e) # This code is contributed by Mohit Kumar
C#
// C# program to print // the nearest K neighbour // nodes (including itself) using System; using System.Collections; class GFG { // Structure of an edge public class arr { public int from, to; public arr(int from, int to) { this.from = from; this.to = to; } }; // Recursive function to print // the neighbor nodes of a node // until K distance static void dfs(int k, int node, int parent, ArrayList []tree) { // Base condition if (k < 0) return; // Print the node Console.Write(node+" "); ArrayList tmp = (ArrayList)tree[node]; // Traverse the connected // nodes/adjacency list foreach (int i in tmp) { if (i != parent) { // node i becomes the parent // of its child node dfs(k - 1, i, node, tree); } } } // Function to print nodes under // distance k static void print_under_dis_K(arr []graph, int node, int k, int v, int e) { // To make graph with // the given edges ArrayList []tree = new ArrayList[v + 1]; for(int i = 0; i < v + 1; i++) { tree[i] = new ArrayList(); } for (int i = 0; i < e; i++) { int from = graph[i].from; int to = graph[i].to; tree[from].Add(to); tree[to].Add(from); } dfs(k, node, -1, tree); } // Driver Code public static void Main(string[] args) { // Number of vertex and edges int v = 7, e = 6; // Given edges arr []graph = { new arr( 2, 1 ), new arr( 2, 5 ), new arr( 5, 4 ), new arr( 5, 7 ), new arr( 4, 3 ), new arr( 7, 6 ) }; // k is the required distance // upto which are neighbor // nodes should get printed int node = 4, k = 2; // function calling print_under_dis_K(graph, node, k, v, e); } } // This code is contributed by rutvik_56
Javascript
<script> // JavaScript program to print // the nearest K neighbour // nodes (including itself) // Structure of an edge class arr { constructor(from,to) { this.from = from; this.to = to; } } // Recursive function to print // the neighbor nodes of a node // until K distance function dfs(k,node,parent,tree) { // Base condition if (k < 0) return; // Print the node document.write(node + " "); let tmp = tree[node]; // Traverse the connected // nodes/adjacency list for(let i=0;i<tmp.length;i++) { if (tmp[i] != parent) { // Node i becomes the parent // of its child node dfs(k - 1, tmp[i], node, tree); } } } // Function to print nodes under // distance k function print_under_dis_K(graph,node,k,v,e) { // To make graph with // the given edges let tree = new Array(v + 1); for(let i = 0; i < v + 1; i++) { tree[i] = []; } for(let i = 0; i < e; i++) { let from = graph[i].from; let to = graph[i].to; tree[from].push(to); tree[to].push(from); } dfs(k, node, -1, tree); } // Driver Code // Number of vertex and edges let v = 7, e = 6; // Given edges let graph = [ new arr(2, 1), new arr(2, 5), new arr(5, 4), new arr(5, 7), new arr(4, 3), new arr(7, 6) ]; // k is the required distance // upto which are neighbor // nodes should get printed let node = 4, k = 2; // Function calling print_under_dis_K(graph, node, k, v, e); // This code is contributed by unknown2108 </script>
Producción:
4 5 2 7 3