上课笔记【邻接表】
2024-11-09 20:32:02
发布于:浙江
邻接表遍历方式
深度优先搜索的遍历方式
dfs遍历邻接矩阵从a走到b的路径
bool vis[MAXN]; // 标记是否访问过
int mp[MAXN][MAXN]; // 邻接矩阵
int a,b;
void dfs(int it) // it表示当前访问的节点
{
    vis[it] = true; // 标记当前节点为已访问
    if(it==b){
        cout << true << endl;    
        return ;
    }
    // 邻接矩阵查询遍历当前节点的相邻节点
    for(int i=1;i<=n;i++){
        if(mp[it][i] &&!vis[i]){ // 相邻节点未访问过
            dfs(i); // 递归访问相邻节点
        }
    }// 时间复杂度为O(n)
}
dfs遍历邻接表从a走到b的路径
bool vis[MAXN]; // 标记是否访问过
vecotr<int> mp[MAXN]; // 邻接表
void dfs(int it) // it表示当前访问的节点
{
    vis[it] = true; // 标记当前节点为已访问
    if(it==b){
        cout << true << endl;    
        return ;
    }
    // 邻接表查询遍历当前节点的相邻节点
    for(int i=0;i<mp[it].size();i++){
        if(!vis[mp[it][i]]){ // 相邻节点未访问过
            dfs(mp[it][i]); // 递归访问相邻节点
        }
    }
}
邻接表和邻接矩阵查询效率区别
//邻接矩阵遍历方式
for(int i=1;i<=n;i++){ // 遍历所有节点  
        if(mp[it][i] &&!vis[i]){ // 相邻节点未访问过
            dfs(i); // 递归访问相邻节点
        }
    }// 时间复杂度为O(n)
// 邻接表查询遍历当前节点的相邻节点
    for(int i=0;i<mp[it].size();i++){
        if(!vis[mp[it][i]]){ // 相邻节点未访问过
            dfs(mp[it][i]); // 递归访问相邻节点
        }
    } // 时间复杂度为O(m)   
广度优先搜索的遍历方式
bfs遍历邻接矩阵从a走到b的路径
bool vis[MAXN]; // 标记是否访问过
int mp[MAXN][MAXN]; // 邻接矩阵
int a,b;
void bfs(){
    queue<int> q; // 队列
    q.push(a); // 起始节点入队
    vis[a] = true; // 标记起始节点为已访问
    while(!q.empty()){
        int it = q.front(); // 取出队首节点
        q.pop(); // 队首出队
        if(it==b){
            cout << true << endl;    
            return ;
        }
        // 邻接矩阵查询遍历当前节点的相邻节点
        for(int i=1;i<=n;i++){ // O(n)
            if(mp[it][i] &&!vis[i]){ // 相邻节点未访问过
                q.push(i); // 相邻节点入队
                vis[i] = true; // 标记相邻节点为已访问
            }
        }
    }
}
bfs遍历邻接表从a走到b的路径
bool vis[MAXN]; // 标记是否访问过
vecotr<int> mp[MAXN]; // 邻接表
void bfs(){
    queue<int> q; // 队列
    q.push(a); // 起始节点入队
    vis[a] = true; // 标记起始节点为已访问
    while(!q.empty()){
        int it = q.front(); // 取出队首节点
        q.pop(); // 队首出队
        if(it==b){
            cout << true << endl;    
            return ;
        }
        // 邻接表查询遍历当前节点的相邻节点
        for(int i=0;i<mp[it].size();i++){ // O(m)
            if(!vis[mp[it][i]]){ // 相邻节点未访问过
                q.push(mp[it][i]); // 相邻节点入队
                vis[mp[it][i]] = true; // 标记相邻节点为已访问
            }
        }
    }
}
这里空空如也









有帮助,赞一个