1. 程式人生 > 實用技巧 >圖的遍歷

圖的遍歷

深度優先遍歷:

  鄰接矩陣版

bool G[1000][1000];
bool visited[1000]; 
void dfs(int v){
    visited[v]=true;
    for(int i=1;i<=n;i++){
        if(G[v][i]==true){
            if(visited[i]==false){
                dfs(i);
            }    
        }
    }
}
void dfsTraverse(){
    fill(visited,visited+n+1,false);    //初始化visited陣列 
for(int i=1;i<=n;i++){ //n是圖中頂點數量 if(visited[i]==false){ dfs(i); } } }

  鄰接表版

vector<int> G[1000];
bool visited[1000]; 
void dfs(int v){
    visited[v]=true;
    for(int i=0;i<G[v].size();i++){
        if(G[v][i]==true){
            if(visited[i]==false
){ dfs(i); } } } } void dfsTraverse(){ fill(visited,visited+n+1,false); //初始化visited陣列 for(int i=1;i<=n;i++){ //n是圖中頂點數量 if(visited[i]==false){ dfs(i); } } }

廣度優先遍歷

  鄰接矩陣版:

void bfs(int v){
    queue
<int> q; q.push(v); while(!q.empty()){ int temp=q.front(); q.pop(); visited[v]=true; for(int i=1;i<=n;i++){ if(G[temp][i]==true&&visited[i]==false){ visited[i]=true; q.push(i); } } } } void bfsTraverse(){ fill(visited,visited+n+1,false); //初始化visited陣列 for(int i=1;i<=n;i++){ //n是圖中頂點數量 if(visited[i]==false){ bfs(i); } } }

  鄰接表版:

vector<int> G[1000];
bool visited[1000]; 
void bfs(int v){
    queue<int> q;
    q.push(v);
    while(!q.empty()){
        int temp=q.front();
        q.pop();
        visited[v]=true;
        for(int i=0;i<G[temp].size();i++){
            if(G[temp][i]==true&&visited[i]==false){
                visited[i]=true;
                q.push(i);
            }
        }
    }
}
void bfsTraverse(){
    fill(visited,visited+n+1,false);    //初始化visited陣列 
    for(int i=1;i<=n;i++){                //n是圖中頂點數量 
        if(visited[i]==false){
            bfs(i);
        }
    }
}