该图的有向拓扑图为:
分析:
- 利用栈的思想,先将没有出度的点放入数组中
- 当有出度的点都处理之后,那么他就成为没有出度的点,所以,最后要将他本身也放入数组中,并且标记为已访问
- 最后返回最初开始的点的时候并没有完,而是继续进行下一个没有被访问的点
/**
*@author yangyvting
*@date 2019年5月5日
*/
package 图论;
public class Main {
public static int n = 4;
public static int graph[][] = {
{0, 1, 0 , 0},
{0, 0, 0 , 0},
{0, 1, 0 , 0},
{0, 0, 1 , 0}
};
public static char st[] = "abcd".toCharArray();
public static boolean vis[] = new boolean[n];
public static char num[] = new char[n];
public static int t = n - 1;
public static void main(String[] args) {
for(int i = 0; i < n; i ++) {
if(!vis[i])Dfs(i);
}
for(char x : num) {
System.out.println(x);
}
}
private static void Dfs(int ns) {
//跳出递归的条件
if(t == -1) {
return;
}
//寻找没有出度的点
for(int i = 0; i < n; i ++ ) {
if(!vis[i] && graph[ns][i] == 1) {//如果还有出度,继续递归下一节点
vis[i] = true;
Dfs(i);
}
if(i == n -1) {
//如果到达了最后尾部,说明就没再没有出度,因为已近被处理了
num[t] = st[ns]; //将该点加入
t --;
vis[ns] = true; //并且标记为已近访问
}
}
}
}
运行结果:
d
c
a
b