Find if there is a path of more than k length from a source - GeeksforGeeks
Given a graph, a source vertex in the graph and a number k, find if there is a simple path (without any cycle) starting from given source and ending at any other vertex.
Read full article from Find if there is a path of more than k length from a source - GeeksforGeeks
Given a graph, a source vertex in the graph and a number k, find if there is a simple path (without any cycle) starting from given source and ending at any other vertex.
Input : Source s = 0, k = 58
Output : True There exists a simple path 0 -> 7 -> 1 -> 2 -> 8 -> 6 -> 5 -> 3 -> 4
Which has a total distance of 60 km which is more than 58.
One important thing to note is, simply doing BFS or DFS and picking the longest edge at every step would not work. The reason is, a shorter edge can produce longer path due to higher weight edges connected through it.
The idea is to use Backtracking. We start from given source, explore all paths from current vertex. We keep track of current distance from source. If distance becomes more than k, we return true. If a path doesn’t produces more than k distance, we backtrack.
How do we make sure that the path is simple and we don’t loop in a cycle? The idea is to keep track of current path vertices in an array. Whenever we add a vertex to path, we check if it already exists or not in current path. If it exists, we ignore the edge.
// This class represents a dipathted graph using// adjacency list representationclass Graph{ int V; // No. of vertices // In a weighted graph, we need to store vertex // and weight pair for every edge list< pair<int, int> > *adj; bool pathMoreThanKUtil(int src, int k, vector<bool> &path);
};
// Returns true if graph has path more than k lengthbool Graph::pathMoreThanK(int src, int k){ // Create a path array with nothing included // in path vector<bool> path(V, false); // Add source vertex to path path[src] = 1; return pathMoreThanKUtil(src, k, path);}// Prints shortest paths from src to all other verticesbool Graph::pathMoreThanKUtil(int src, int k, vector<bool> &path){ // If k is 0 or negative, return true; if (k <= 0) return true; // Get all adjacent vertices of source vertex src and // recursively explore all paths from src. list<iPair>::iterator i; for (i = adj[src].begin(); i != adj[src].end(); ++i) { // Get adjacent vertex and weight of edge int v = (*i).first; int w = (*i).second; // If vertex v is already there in path, then // there is a cycle (we ignore this edge) if (path[v] == true) continue; // If weight of is more than k, return true if (w >= k) return true; // Else add this vertex to path path[v] = true; // If this adjacent can provide a path longer // than k, return true. if (pathMoreThanKUtil(v, k-w, path)) return true; // Backtrack path[v] = false; } // If no adjacent could produce longer path, return // false return false;}// Allocates memory for adjacency listGraph::Graph(int V){ this->V = V; adj = new list<iPair> [V];}// Utility function to an edge (u, v) of weight wvoid Graph::addEdge(int u, int v, int w){ adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w));}
Modify the above solution to find weight of longest path from a given source.