图的实现
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());
*/
}
}