zoukankan      html  css  js  c++  java
  • 图的连通分量(利用邻接表存储信息)

    用vector实现邻接表

    vector <int> G[100]; //表示有100个顶点的图的邻接表

    G[u].push_back(v); //从顶点u 向顶点v 画边,即在相当于创建一个二维数组G[100][i]

    //搜索与顶点u 相邻的顶点v

    for( int i = 0; i < G[u].size(); i++) {

      int v = G[u][i];

      .......

     }

     邻接表表示法的优点

      只需与边数成正比的内存空间

    邻接表表示法的缺点

    (1)设u 的相邻顶点数量为n,那么在调查顶点u 与顶点v 的关系时,需要消耗O(n)来搜索邻接表。

    (2)难以有效的删除边

    #include<iostream>
    #include<vector>
    #include<stack>
    using namespace std;
    
    static const int MAX = 100000;
    static const int NIL = -1;
    
    int n;
    vector <int> G[MAX];
    int color[MAX];
    
    //深度优先遍历  
    void dfs(int r, int c) {
        stack <int> S;
        S.push(r);
        color[r] = c;
        while( !S.empty() ) {
            int u = S.top();
            S.pop();
            for(int i = 0; i < G[u].size(); i++) {
                int v = G[u][i];
                if(color[v] == NIL) {
                    color[v] = c;
                    S.push(v);
                }
            }
        }
    } 
    
    void assignColor() {
        int id = 1;
        //设置初始值 
        for( int i = 0; i < n; i++ )    color[i] = NIL;
        //以未访问的u为起点进行深度优先搜索 
        for( int u = 0; u < n; u++ ) {
            if( color[u] == NIL )    dfs(u, id++);
        }
    }
    
    int main() {
        int s, t, m, q;
        // n为用户数(顶点数), m 为关系个数 
        cin >> n >> m;
        //建立邻接表 
        for(int i = 0; i < m; i++) {
            cin >> s >> t;
            G[s].push_back(t);
            G[t].push_back(s);
        }
        //深度优先遍历,将可以连通的顶点的color设置成同一值 
        assignColor();
        
        cin >> q;
        
        for(int i = 0; i < q; i++) {
            cin >> s >> t;
            if( color[s] == color[t] ) {
                cout << "yes" << endl;
            }
            else {
                cout << "no" << endl;
            }
        }
        
        return 0;
    }
    
    /*
    10 9 
    0 1 
    0 2
    3 4 
    5 7
    5 6
    6 7
    6 8
    7 8 
    8 9
    3
    0 1
    5 9
    1 3
    */ 
  • 相关阅读:
    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作
    血腥!实况转播SQL注入全过程,让你知道危害有多大。
    DB2隔离级别设置
    使用解释工具分析SQL语句
    DB2的七种武器
    db2精华文档和论坛链接
    “饮水机”:形象比喻 深入浅出理解RAID
    DB2 数据库恢复测试
    IBM DB2 日常维护汇总
    镜像分割与高可用性灾难恢复
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/12622116.html
Copyright © 2011-2022 走看看