グラフdfs_euler
/オイラー路とオイラー回路/
/ *
- 無向グラフのノードから始めて、道路を出て、両側が1回だけ通過します。このようなルートは、オイラーの道路と呼ばれます。
- 無向グラフが接続されていて、最大で2つの特異点(奇数度)がある場合は、オイラーパスが必要です。
- 2つの特異点がある場合、それらは開始点である必要があり、
- 特異点が存在しない場合は、任意のポイントから開始して、最終的にそのポイントに戻ることができます。これは、オイラーの回路と呼ばれます。
- * /
import java.util.Stack;
public class 图的dfs_euler {
static Stack<String> path = new Stack<>();
//图的邻接矩阵
private static int[][] graph = {
{
0, 1, 2, 1},
{
1, 0, 0, 0},
{
2, 0, 0, 1},
{
1, 0, 1, 0}
};
// 节点数
private static final int n = 4;
//标记边的访问情况,因为通路是双向的,所以用二维数组
private static int[][] vis = new int[n][n];
/**
*
* @param u 现在访问的顶点
*/
static void euler(int u) {
//其他顶点
for (int v = 0; v < n; v++) {
//有边,且访问次数少于连接数
if (graph[u][v] > 0 && vis[u][v] < graph[u][v]) {
//路是双向的
vis[u][v]++;
vis[v][u]++;
//v作为新的起点,递归
euler(v);
//已走u->v,将这一步走法加入栈中
path.push((char) ('A' + u) + "->" + (char) ('A' + v));
}
}
}
public static void main(String[] args) {
euler(2);
while (!path.isEmpty())
System.out.println(path.pop());
}
}