Rumah > Java > javaTutorial > teks badan

Cara menggunakan java untuk melaksanakan algoritma graf kitaran Euler

WBOY
Lepaskan: 2023-09-19 09:01:10
asal
944 orang telah melayarinya

Cara menggunakan java untuk melaksanakan algoritma graf kitaran Euler

Bagaimana untuk menggunakan Java untuk melaksanakan algoritma graf kitaran Euler?

Litar Eulerian ialah masalah teori graf klasik Intipatinya ialah untuk mencari laluan yang boleh melalui setiap tepi dalam graf sekali dan sekali sahaja, dan akhirnya kembali ke nod permulaan. Artikel ini akan memperkenalkan cara menggunakan bahasa Java untuk melaksanakan algoritma graf kitaran Euler dan memberikan contoh kod khusus.

1. Perwakilan graf
Sebelum melaksanakan algoritma gelung Euler, anda perlu memilih perwakilan graf yang sesuai. Perwakilan biasa termasuk matriks bersebelahan dan senarai bersebelahan. Dalam artikel ini, kami akan menggunakan senarai bersebelahan untuk mewakili graf.

Senarai bersebelahan ialah struktur data senarai terpaut, yang mewakili setiap nod dalam graf sebagai nod senarai terpaut, yang merekodkan nod bersebelahan terus dengan nod. Berikut ialah contoh graf yang diwakili oleh senarai bersebelahan:

import java.util.LinkedList;

// 图中的节点类
class Node {
    int val;
    LinkedList<Node> neighbors;

    public Node(int val) {
        this.val = val;
        this.neighbors = new LinkedList<Node>();
    }
}

// 图类
class Graph {
    LinkedList<Node> vertices;

    public Graph() {
        this.vertices = new LinkedList<Node>();
    }

    public void addNode(Node node) {
        vertices.add(node);
    }
}
Salin selepas log masuk

Dalam contoh ini, setiap nod diwakili menggunakan kelas Nod, di mana val atribut mewakili nilai nod dan jiran atribut mewakili nod yang bersebelahan terus dengan nod. Graf diwakili oleh kelas Graf, dan bucu atributnya ialah senarai terpaut yang mewakili semua nod dalam graf.

2. Pelaksanaan algoritma gelung Euler
Berikut ialah contoh kod menggunakan Java untuk melaksanakan algoritma gelung Euler:

import java.util.Stack;

// 图中的节点类
class Node {
    int val;
    LinkedList<Node> neighbors;
    boolean visited;

    public Node(int val) {
        this.val = val;
        this.neighbors = new LinkedList<Node>();
        this.visited = false;
    }
}

// 图类
class Graph {
    LinkedList<Node> vertices;

    public Graph() {
        this.vertices = new LinkedList<Node>();
    }

    public void addNode(Node node) {
        vertices.add(node);
    }

    // 深度优先搜索
    public void dfs(Node node) {
        System.out.print(node.val + " ");
        node.visited = true;

        for (Node neighbor : node.neighbors) {
            if (!neighbor.visited) {
                dfs(neighbor);
            }
        }
    }

    // 判断图是否连通
    public boolean isConnected() {
        for (Node node : vertices) {
            if (!node.visited) {
                return false;
            }
        }
        return true;
    }

    // 判断图中是否存在欧拉回路
    public boolean hasEulerCircuit() {
        for (Node node : vertices) {
            if (node.neighbors.size() % 2 != 0) {
                return false;
            }
        }
        return isConnected();
    }

    // 找到欧拉回路
    public void findEulerCircuit(Node node) {
        Stack<Node> stack = new Stack<Node>();
        stack.push(node);

        while (!stack.isEmpty()) {
            Node current = stack.peek();
            boolean hasUnvisitedNeighbor = false;

            for (Node neighbor : current.neighbors) {
                if (!neighbor.visited) {
                    stack.push(neighbor);
                    neighbor.visited = true;
                    current.neighbors.remove(neighbor);
                    neighbor.neighbors.remove(current);
                    hasUnvisitedNeighbor = true;
                    break;
                }
            }

            if (!hasUnvisitedNeighbor) {
                Node popped = stack.pop();
                System.out.print(popped.val + " ");
            }
        }
    }

    // 求解欧拉回路
    public void solveEulerCircuit() {
        if (hasEulerCircuit()) {
            System.out.println("欧拉回路:");
            findEulerCircuit(vertices.getFirst());
        } else {
            System.out.println("图中不存在欧拉回路!");
        }
    }
}
Salin selepas log masuk

Dalam contoh ini, kami mentakrifkan kelas Graf dan kelas Nod, di mana kelas Graf mengandungi kedalaman- carian pertama (dfs), tentukan sama ada graf disambungkan (isConnected), tentukan sama ada terdapat litar Euler dalam graf (hasEulerCircuit), cari algoritma litar Euler (findEulerCircuit) dan selesaikan litar Euler (solveEulerCircuit) dan kaedah lain.

3. Contoh Penggunaan
Berikut ialah contoh cara menggunakan kod di atas untuk menyelesaikan masalah kitaran Euler bagi graf tertentu:

public class Main {
    public static void main(String[] args) {
        // 创建图
        Graph graph = new Graph();

        // 创建节点
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);

        // 添加节点
        graph.addNode(node1);
        graph.addNode(node2);
        graph.addNode(node3);
        graph.addNode(node4);
        graph.addNode(node5);

        // 建立节点之间的关系
        node1.neighbors.add(node2);
        node1.neighbors.add(node3);
        node1.neighbors.add(node4);
        node2.neighbors.add(node1);
        node2.neighbors.add(node3);
        node3.neighbors.add(node1);
        node3.neighbors.add(node2);
        node3.neighbors.add(node4);
        node4.neighbors.add(node1);
        node4.neighbors.add(node3);
        node5.neighbors.add(node2);
        node5.neighbors.add(node4);

        // 求解欧拉回路
        graph.solveEulerCircuit();
    }
}
Salin selepas log masuk

Dalam contoh ini, kami mencipta graf yang mengandungi 5 nod dan mewujudkan perhubungan antara. Kemudian kami memanggil kaedah solveEulerCircuit dalam kelas Graf untuk menyelesaikan litar Euler dan mengeluarkan hasilnya.

Ringkasan:
Artikel ini memperkenalkan cara menggunakan bahasa Java untuk melaksanakan algoritma graf kitaran Euler. Mula-mula, kaedah perwakilan graf yang sesuai telah dipilih, dan kemudian algoritma teras seperti carian mendalam-dahulu dan mencari litar Euler telah dilaksanakan. Akhir sekali, contoh penggunaan khusus diberikan. Saya harap pembaca dapat lebih memahami dan menguasai algoritma gelung Euler bagi graf melalui pengenalan dan contoh artikel ini.

Atas ialah kandungan terperinci Cara menggunakan java untuk melaksanakan algoritma graf kitaran Euler. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!