数据结构之图(下)


图的实现

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());
        */
         } 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值