1. 程式人生 > >BFS求圖中給定點到各點的最短邊數

BFS求圖中給定點到各點的最短邊數

//廣度優先搜尋樹,一定要使用佇列,佇列的特性很好用
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();
        }
    }
}