DFS 및 BFS를 사용한 그래프의 토폴로지 정렬 GeeksForGeeks
12560 단어 javagraphalgorithms
u
와 v
의 가장자리가 있는 경우 u
가 순서에서 v
앞에 와야 하는 그래프 노드의 선형 순서입니다.메모:
DFS 접근 방식:
시간 복잡도:
O(N+E)
및 공간 복잡도: O(N)+O(N)+O(N)+O(N) = O(N)*4 (재귀 호출을 위한 보조 스택 공간, 방문 배열을 위한 N, 결과 배열의 경우 N, 스택의 경우 4번째 N)/*Complete the function below*/
/*Topological sorting:
* A linear ordering of vertices such that if there is an edge between u->v, then
u appears before v in the ordering
*/
class Solution
{
//Function to return list containing vertices in Topological order.
static int[] topoSort(int V, ArrayList<ArrayList<Integer>> adj)
{
//we will use depth first search for this
//we have to make sure that u appears before v , if there is
//an edge between u and v
//hence using depth first search would be a better approach.
Stack<Integer> stack = new Stack<>();
int visited[] = new int[V];
for(int i =0;i<V;i++){
if(visited[i] ==0){
dfs(i,visited,stack,adj);
}
}
int result[] = new int[V];
int index =0;
while(!stack.isEmpty()){
result[index] = stack.pop();
index++;
}
return result;
}
public static void dfs(int node, int[] visited,Stack<Integer> stack, ArrayList<ArrayList<Integer>> adj){
visited[node] = 1;
for(Integer i: adj.get(node)){
if(visited[i] ==0){
dfs(i,visited,stack,adj);
}
}
stack.push(node);
}
}
토폴로지 정렬에 대한 BFS 접근: Kahn의 알고리즘 사용
시간 복잡도: O(N+E) 및 공간 복잡도는 inodegree 배열, 대기열 및 결과 배열에 대해 O(n)*3이 됩니다.
/*Complete the function below*/
class Solution
{
//Function to return list containing vertices in Topological order.
static int[] topoSort(int V, ArrayList<ArrayList<Integer>> adj)
{
//we will use Kahn's algorithm for getting topological sorting, it uses
//breadh first search algorithm
// we will be required to calculate the indegree of all the nodes;
int indegree[] = new int[V];
/// calculating indegrees of all the nodes
for(int i =0;i<V;i++){
for(Integer j : adj.get(i)){
indegree[j]++;
}
}
Queue<Integer> q = new LinkedList<>();
//putting those nodes in the queue whose indegrees are 0
//because these are the nodes that have no incoming edge to them hence they
//can be at the start of the topological sorting as it will not cause any issue
//because we are maintaining order of u followed by v where u->v (u has edge directed towards v)
for(int i =0;i<V;i++){
if(indegree[i]==0){
q.add(i);
}
}
int result[] = new int[V];
int index =0;
while(!q.isEmpty()){
Integer i = q.remove();
result[index++] = i;
for(Integer node : adj.get(i)){
// here we re reducing the indegrees as the nodes that are alredy there
// the queue are getting removed hence there edges with the node 'node' will
//also be removed hence there indegrees will decrease by one
indegree[node]--;
//and as soon as there indegrees becomes 0 means they are independent now and they have no incoming edge to them
//hence they can be added to queue just like we did earlier.
if(indegree[node]==0){
q.add(node);
}
}
}
return result;
}
}
Reference
이 문제에 관하여(DFS 및 BFS를 사용한 그래프의 토폴로지 정렬 GeeksForGeeks), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/prashantrmishra/topological-sorting-in-graph-using-dfs-and-bfs-geeksforgeeks-28f2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)