數據結構之圖(下)


圖的實現

public class Graph {

    private List<Node> nodes; //所有節點的集合
    private Map<Node,List<Side>> sides; //圖的構成數據,每一個節點包含一個list<Side>,list裏面是所有和該節點相鄰的side
    
    public Graph(){
    nodes=new ArrayList<Node>();
    sides=new HashMap<Node,List<Side>>();
    }
    
    public void addNode(Node node,List<Side> list){
    nodes.add(node);
    sides.put(node, list);
    }
        
//深度優先搜索
    public void DFS(){
           if(nodes.isEmpty()||sides.isEmpty()){
          System.out.println("圖爲空,無法執行深度優先搜索");
          return;
           }
           Node node=nodes.get(0);
            DFS(node);         
    }
    


//深度優先搜索實現
    private void DFS(Node node){
    
        if(node.isVisited())
       return;
       node.setVisited(true);
       System.out.println("到了"+node.getName());
        List<Side> node_sides=sides.get(node);
        for(int j=0;j<node_sides.size();j++){
        DFS(node_sides.get(j).getTo());
        }
        }
    


    //廣度優先搜索
    public void EFS(){
    
     if(nodes.isEmpty()||sides.isEmpty()){
          System.out.println("圖爲空,無法執行廣度優先搜索");
          return;
          }
          Node node=nodes.get(0);
           EFS(node);     
    }
    


//廣度優先搜索實現
    private void EFS(Node node){
    
    if(node.isVisited())
    return;
    node.setVisited(true);
    System.out.println("訪問了城市:"+node.getName());
    Queue<Node> my_queue=new LinkedList<Node>();
    
    my_queue.add(node);
    
        while(!my_queue.isEmpty()){
        
    List<Side> node_sides=sides.get(my_queue.peek());
      
    for(int i=0;i<node_sides.size();i++){
      Node now_node=node_sides.get(i).getTo();
      if(now_node.isVisited())
      continue;
      now_node.setVisited(true);
      System.out.println("訪問了城市:"+now_node.getName());
      my_queue.add(now_node);
    }
    
    my_queue.poll();
        }     
    }
    


//尋找第一個節點到其他每個節點的最短距離,最短距離存儲在每個節點的數據域裏面
    public void least_distance(){
     if(nodes.isEmpty()||sides.isEmpty()){
            System.out.println("圖爲空,無法執行最短距離檢測");
            return;
             }
             Node node=nodes.get(0);
              least_distance(node);    
    }


private void least_distance(Node node) {


List<Side> node_sides=sides.get(node);
 node.setDis_centern(true);

 
 
List<Node> dis_un=new ArrayList<Node>();
 
 
for(int i=0;i<node_sides.size();i++){
Node temp=node_sides.get(i).getTo();
if(!temp.isDis_centern()){
temp.setDis(node_sides.get(i).getDis());
temp.setPath(temp.getPath()+node.getName()+"-->");
dis_un.add(temp);
}
}
 
while(!dis_un.isEmpty()){
 
 
Node close_node=dis_un.get(0);
int min_dis=dis_un.get(0).getDis();
for(int i=1;i<dis_un.size();i++){
Node temp=dis_un.get(i);
if(temp.getDis()<min_dis){
close_node=temp;
min_dis=temp.getDis();
}
}
 

 
close_node.setDis_centern(true);
close_node.setPath(close_node.getPath()+close_node.getName());
System.out.println("從"+node.getName()+"到"+close_node.getName()+"的最大距離是"+close_node.getDis());
System.out.println("路線如下1:"+close_node.getPath());
 
dis_un.remove(close_node);
 
if(dis_un.isEmpty())
break;
 
List<Side> temp_list=sides.get(close_node);
for(int i=0;i<temp_list.size();i++){
Node temp=temp_list.get(i).getTo();
     if(temp.isDis_centern()) continue;
     if(dis_un.contains(temp)){
     int already=temp.getDis();
     int now=close_node.getDis()+temp_list.get(i).getDis();
     if(now<already){
     temp.setDis_centern(true);
     temp.setDis(now);
     temp.setPath(close_node.getPath()+"-->"+temp.getName());
     System.out.println("從"+node.getName()+"到"+temp.getName()+"的最大距離是"+temp.getDis());
     System.out.println("路線如下2:"+temp.getPath());
     dis_un.remove(temp);
     continue;
     }
     }else{
     temp.setDis(close_node.getDis()+temp_list.get(i).getDis());
     temp.setPath(close_node.getPath()+"-->");
     dis_un.add(temp);
     }
}
}
 
/*
System.out.println("全部最短距離都已經獲取!");
         for(int i=1;i<nodes.size();i++){
        Node snode=nodes.get(i);
        System.out.println("從"+node.getName()+"到"+snode.getName()+"的最大距離是"+snode.getDis());
        System.out.println("路線如下:"+snode.getPath());
        */
         } 
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章