簡體   English   中英

BFS Graph循環執行

[英]BFS Graph loop execution

我試圖在形成的圖形中首先遍歷廣度。 我的圖表在 arraylist 的 arraylist 的鄰接表中,如下所示

void bfs(int root,Graph g)
    {
        boolean[] visited = new boolean[g.al.size()];
        Queue<Integer> q = new LinkedList<Integer>();
        
        q.add(root);
        
        
        
        visited[root] = true;
        
        while(!q.isEmpty())
        {
            int v = q.remove();
            System.out.print(v);
        
       // **Using for each loop ( i.e. for(int k:g.al.get(v))) works well , but it isn't working with this for loop**
        for(int k= g.al.get(v).get(0) ; k <= g.al.get(v).size() ; k++ )
        {
            if(visited[k]==false)
            {
                visited[k]=true;
                q.add(k);
            }
        }           
        }           
    }

我的圖class如下:

class Graph
    {
        int v;
        ArrayList<ArrayList<Integer>> al = new ArrayList<>();
        
        Graph(int v)
        {
            this.v = v;
            
            for(int i = 0 ; i < v; i++)
            {
                al.add(new ArrayList<Integer>());
            }
            
            
        }
    
    public Graph() {
            // TODO Auto-generated constructor stub
        }

    void addEdge(int sr,int des)
    {
        al.get(sr).add(des);
        al.get(des).add(sr);
    }
    

bfs function中的for循環只對第一次通過的節點執行。它為第一次通過的節點添加隊列中的元素。 然后在進入 while 循環后不屬於 for 循環。

enhanced for loop 和indexed for loop 的區別在於它們分別遍歷索引

在您的代碼中, k變量是一個索引而不是實際的圖形

增強for (int k: g.al.get(v)))遍歷所有,類似的索引 for 循環行為可以通過遍歷索引並為每個索引獲取相應的來實現

ArrayList<Integer> list = g.al.get(v);
for (int k = 0 ; k < list.size() ; k++ ) {
    int value = list.get(k);
    if (visited[value] == false) {
         visited[value] = true;
         q.add(value);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM