DFS java寻路问题

时间:2012-03-21 17:44:17

标签: java

我正在开发一种搜索算法,用于在图表中查找路径。在这个算法中,我需要找到一个无向的,而不是加权的图形中的所有路径,它们只通过每个图形连接一次。 目前,我的prgoram正在做的是找到通过每个节点只有一次的所有路径。我需要连接而不是节点。

这是我的代码:

import java.util.*;

public class dfs {

    private static Map<Integer, LinkedHashSet<Integer>> map = new HashMap<Integer, LinkedHashSet<Integer>>();
    private int startNode;
    private int numLinks;

    public dfs(int startNode, int numLinks) {
        super();
        this.startNode = startNode;
        this.numLinks = numLinks;
    }

    public int getNumLinks(){
        return numLinks;    
    }

    public void addEdge(int source, int destiny) {
        LinkedHashSet<Integer> adjacente = map.get(source);
        if(adjacente==null) {
            adjacente = new LinkedHashSet<Integer>();
            map.put(source, adjacente);
        }
        adjacente.add(destiny);
    }

    public void addLink(int source, int destiny) {
        addEdge(source, destiny);
        addEdge(destiny, source);
    }

    public LinkedList<Integer> adjacentNodes(int adj) {
        LinkedHashSet<Integer> adjacente = map.get(adj);
        System.out.println("adjacentes:" + adjacente);
        if(adjacente==null) {
            return new LinkedList<Integer>();
        }
        return new LinkedList<Integer>(adjacente);
    }


public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    int numVertices = input.nextInt();
    int numLinks = input.nextInt();
    int startNode = input.nextInt();
    int endNode = startNode;

    dfs mapa = new dfs(startNode, numLinks);

    for(int i = 0; i<numLinks; i++){
        mapa.addLink(input.nextInt(), input.nextInt());
    }

    List<ArrayList<Integer>> paths = new ArrayList<ArrayList<Integer>>();
    List<Integer> visited = new ArrayList<Integer>();
    visited.add(startNode);
    Integer currentNode = 0;

    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        currentNode = (Integer) pairs.getKey(); 

        mapa.findAllPaths(mapa, visited, paths, currentNode);
    }
}

private void findAllPaths(dfs mapa, List<Integer> visited,
        List<ArrayList<Integer>> paths, Integer currentNode) {

    if (currentNode.equals(startNode)) { 
        paths.add(new ArrayList<Integer>(visited));

        LinkedList<Integer> nodes = mapa.adjacentNodes(currentNode); 

        for (Integer node : nodes) {
            List<Integer> temp = new ArrayList<Integer>();
            temp.addAll(visited);
            temp.add(node);  
            System.out.println("temp:" + temp);

            findAllPaths(mapa, temp, paths, node);
        }   
    }
    else {
        LinkedList<Integer> nodes = mapa.adjacentNodes(currentNode);  
        System.out.println("currentNode:" + currentNode);

        List<Integer> inseridos = new ArrayList<Integer>();

        for (Integer node : nodes) {   
            if (visited.contains(node)) {
                continue;
            } 
            List<Integer> temp = new ArrayList<Integer>();
            inseridos.add(currentNode);
            temp.addAll(visited);
            System.out.println("visited:" + visited);

            temp.add(node);

            findAllPaths(mapa, temp, paths, node);
        }
    }
} 
}

现在,我认为以下代码:

if (visited.contains(node)) {
   continue;
 }

使程序不多次通过每个节点。 我需要帮助将我的程序转换为仅通过每个连接一次,而不是仅通过每个节点一次。

(我很抱歉我的英语,我不是本地人)

1 个答案:

答案 0 :(得分:0)

如果你愿意做一些重写,我认为这种问题以OO方式表达得更清晰。

您可以从NodeEdge实例构建链接图,允许您在遍历图表时标记访问过的边。

class Node
{
  List<Edge> adjacentEdges;
  boolean isVisited;
}

class Edge
{
  Node node1;
  Node node2;
  boolean isVisited;
}