Простыми словами Tree is a non cyclic data structure
, и когда есть циклы, это становится Graph
.
Выше приведено пример графика. Вы можете представить его с помощью списка Adjacency или матрицы смежности. Вы можете обратиться к http://krishnalearnings.blogspot.in/2015/11/basics-of-graph-in-computer-science.html за основы графов.
На картинке выше мы можем представить ее ниже (В вашем вопросе вы использовали вид списка смежности).
int[][] graph = { {0,1,0,0,0,0},
{0,0,1,0,0,0},
{0,0,0,1,1,0},
{0,0,0,0,0,0},
{0,0,0,0,0,1},
{0,1,0,0,0,0},
};
1 представляет собой край от соответствующей строки с нумерованной вершиной до нумерованной колонки.
Мы можем написать простой способ обнаружения присутствия цикла и распечатать любой график на графике.
static int[] cycleElements;
static int cycleElementIndex = 0;
static boolean cycleFound = false;
static final int NEW = 0;
static final int PUSHED = 1;
static final int POPPED = 2;
public static int findCycle(int[][] graph,int N, int u, int[] states){
for(int v = 0; v < N; v++){
if(graph[u][v] == 1){
if(states[v] == PUSHED){
// cycle found
cycleFound = true;
return v;
}else if(states[v] == NEW){
states[v] = PUSHED;
int poppedVertex = findCycle(graph, N, v, states);
states[v] = POPPED;
if(cycleFound){
if(poppedVertex == u){
cycleElements[cycleElementIndex++] = v;
cycleElements[cycleElementIndex++] = u;
cycleFound = false;
}else{
cycleElements[cycleElementIndex++] = v;
return poppedVertex;
}
}
}
}
}
return -1;
}
public static void main(String[] args) {
int N = 6;
int[][] graph = { {0,1,0,0,0,0},
{0,0,1,0,0,0},
{0,0,0,1,1,0},
{0,0,0,0,0,0},
{0,0,0,0,0,1},
{0,1,0,0,0,0},
};
cycleElements = new int[N];
int[] states = new int[N];
states[0] = PUSHED;
findCycle(graph,N,0,states);
for(int i = 0; i < cycleElementIndex; i++){
System.out.println(cycleElements[i]);
}
}
Вы можете легко преобразовать выше подход к списку смежности, если вы хотите, хотя представление не имеет большое значение (только список смежности может сэкономить пространство по сравнению с матрицей смежности)
цикла происходит, когда вы посещаете узел, который вы посещали ранее. Поэтому следите за узлами, которые вы уже посетили (например, в 'Set') и ошибкой, если вы уже видели этот узел. – dimo414