BFS求圖中給定點到各點的最短邊數
阿新 • • 發佈: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); int du[]=new int[V+1]; visit[1]=1; int cnt=0; 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); du[temp1]=du[temp0]+1; //這一點是關鍵用於更新起點到個點的最短路徑(邊數) } } } //列印結果 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(); int flag3=1; for(int j=2;j<=V;j++){ if(flag3==1){ System.out.print(du[j]); flag3=0; }else{ System.out.print(" "+du[j]); } } System.out.println(); } } }