利用佇列廣度優先搜尋圖
阿新 • • 發佈:2018-11-09
//廣度優先搜尋樹,一定要使用佇列,佇列的特性很好用 import java.util.*; public class Guangduyouxiansousuosuanfa1 { public static void main(String args[]){ Scanner in=new Scanner(System.in); while(in.hasNext()){ int V=in.nextInt(); int E=in.nextInt(); List<Integer> graph[]=new ArrayList[V+1]; for(int i=0;i<=V;i++) graph[i]=new ArrayList(); for(int i=0;i<E;i++){ int x=in.nextInt(); int y=in.nextInt(); int flag=1; //用鄰接表構建無向圖 for(int j=0;j<graph[j].size();j++){ if(graph[x].get(j)==y){ flag=0; break; } } if(flag==1){ graph[x].add(y); graph[y].add(x); } } //兩個佇列一個用於儲存結果,一個用於遍歷 Queue ans=new LinkedList<>(); Queue tempq=new LinkedList<>(); int visit[]=new int[V+1]; //這裡預設從圖1節點開始廣度優先遍歷 ans.offer(1); tempq.offer(1); visit[1]=1; while(tempq.size()>0){ int temp0=(int)tempq.poll(); for(int i=0;i<graph[temp0].size();i++){ int temp1=graph[temp0].get(i); if(visit[temp1]==0){ visit[temp1]=1; tempq.offer(temp1); ans.offer(temp1); } } } //列印結果 int flag2=1; while(ans.size()>0){ if(flag2==1){ System.out.print(ans.poll()); flag2=0; }else{ System.out.print(" "+ans.poll()); } } System.out.println(); } } }