码迷,mamicode.com
首页 > 其他好文 > 详细

爪哇国新游记之二十五----图及其遍历查找

时间:2014-08-01 19:21:32      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   java   io   数据   for   

代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;


// 顶点类
class Vertex{
    String name;// 名称
    boolean visited;// 是否已访问过
    
    public Vertex(String name){
        this.name=name;
        this.visited=false;
    }
}

// 图类
public class Graph{
    //
    private Vertex[] arr;// 顶点数组
    private int[][] matrix;// 邻接矩阵
    
    // 建立图的数据
    private Set<String> vertexSet;// 包含不重复顶点的集合
    private Map<String,String[]> connMap;// 包含连接的哈希表
    
    // 添加顶点之间的连接关系
    public void addConn(String from,String[] toArr){
        if(vertexSet==null){
            vertexSet=new HashSet<String>();
        }
        
        vertexSet.add(from);
        for(String to:toArr){
            vertexSet.add(to);
        }
        
        if(connMap==null){
            connMap=new LinkedHashMap<String,String[]>();
        }
        
        connMap.put(from, toArr);
    }
    
    // 建立图(即其中的顶点数组和邻接矩阵)
    public void rebuildGraph(){
        // 初始化顶点数组
        List<String> ls=new ArrayList<String>();
        ls.addAll(vertexSet);
        Collections.sort(ls);
        
        int size=ls.size();
        arr=new Vertex[size];
        for(int i=0;i<ls.size();i++){
            arr[i]=new Vertex(ls.get(i));
        }
        
        // 初始化邻接矩阵
        matrix=new int[size][size];
        for(String key:connMap.keySet()){
            String[] values=connMap.get(key);
            
            for(String value:values){
                int x=findVertexIndex(key);
                int y=findVertexIndex(value);
                
                if(x!=-1 && y!=-1){
                    matrix[x][y]=1;
                    matrix[y][x]=1;
                }
            }
        }
    }
    
    // 在顶点数组里找顶点下标
    private int findVertexIndex(String name){
        for(int i=0;i<arr.length;i++){
            if(name.equals(arr[i].name)){
                return i;
            }
        }
        
        return -1;
    }
    
    public void displayMatix(){
        int n=arr.length;
        
        System.out.print("  ");
        for(int i=0;i<n;i++){
            System.out.print(arr[i].name+",");
        }
        System.out.println();
        
        System.out.print("-");
        for(int i=0;i<n;i++){
            System.out.print("--");
        }
        System.out.println();
        
        for(int i=0;i<n;i++){
            System.out.print(arr[i].name+":");
            
            for(int j=0;j<n;j++){
                System.out.print(matrix[i][j]+",");
            }
            
            System.out.println();
        }
    }
    
    // 得到两个点之间的路径
    public String getPath(String from,String to){
        // 初始化
        int fromIndex=findVertexIndex(from);
        if(fromIndex==-1){
            return "找不到顶点:"+from;
        }
        
        int toIndex=findVertexIndex(to);
        if(toIndex==-1){
            return "找不到顶点:"+to;
        }
        
        //  用于记住路径的栈
        Stack<Integer> stack=new Stack<Integer>(Integer.class,arr.length);
        
        // 开始寻找
        arr[fromIndex].visited=true;
        stack.push(fromIndex);
        
        while(stack.isEmpty()==false){
            int j=getConnVertex(stack.peek());
            
            if(j==-1){
                stack.pop();
            }else{
                arr[j].visited=true;
                stack.push(j);
            
                if(arr[j].name.equals(to)){
                    // 找到了
                    
                    StringBuilder sb=new StringBuilder();
                    
                    while(stack.isEmpty()==false){
                        int index=stack.pop();
                        
                        sb.insert(0, arr[index].name+"->");
                    }
                    
                    return sb.substring(0, sb.length()-2);
                }
            }
        }
        
        return "不可能从"+from+"到"+to;
    }
    
    // 取得连接未访问过的顶点
    private int getConnVertex(int i){
        int n=arr.length;
        
        for(int j=0;j<n;j++){
            if(matrix[i][j]==1 && arr[j].visited==false){
                return j;
            }
        }
        
        return -1;
    }
    
    public static void main(String[] args){
        Graph g=new Graph();
        
        g.addConn("A", new String[]{"B","D"});
        g.addConn("B", new String[]{"A","C"});
        g.addConn("C", new String[]{"B","D","E"});
        g.addConn("D", new String[]{"A","C"});
        g.addConn("E", new String[]{"C"});
        g.addConn("F", new String[]{"E","G"});
        g.addConn("G", new String[]{"F"});
        g.addConn("H", new String[]{"I","J"});
        g.addConn("I", new String[]{"H","J"});
        g.addConn("J", new String[]{"H","I"});
        
        g.rebuildGraph();
        g.displayMatix();
        String path=g.getPath("A", "G");
        System.out.println(path);
        
        g.rebuildGraph();
        path=g.getPath("A", "H");
        System.out.println(path);
        
        g.rebuildGraph();
        path=g.getPath("J", "H");
        System.out.println(path);
        
        g.rebuildGraph();
        path=g.getPath("F", "B");
        System.out.println(path);
    }
}

输出:

  A,B,C,D,E,F,G,H,I,J,
---------------------
A:0,1,0,1,0,0,0,0,0,0,
B:1,0,1,0,0,0,0,0,0,0,
C:0,1,0,1,1,0,0,0,0,0,
D:1,0,1,0,0,0,0,0,0,0,
E:0,0,1,0,0,1,0,0,0,0,
F:0,0,0,0,1,0,1,0,0,0,
G:0,0,0,0,0,1,0,0,0,0,
H:0,0,0,0,0,0,0,0,1,1,
I:0,0,0,0,0,0,0,1,0,1,
J:0,0,0,0,0,0,0,1,1,0,
A->B->C->E->F->G
不可能从A到H
J->H
F->E->C->B

 顶点示意图:

bubuko.com,布布扣

爪哇国新游记之二十五----图及其遍历查找,布布扣,bubuko.com

爪哇国新游记之二十五----图及其遍历查找

标签:style   blog   http   color   java   io   数据   for   

原文地址:http://www.cnblogs.com/xiandedanteng/p/3885477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!