【图论】【存图】

存图

  • 邻接矩阵(二维数组):空间O(n2)O(n^2)O(n2) ,一般不用于稀疏图,遍历时先检查是否有边。

  • 邻接表

    • vector存边

      vector<int> G;
      void add_edge(int from, int to) {
      	G[from].push_back(to);
      }
      
    • 如果带权可以用结构体

      struct edge {
        int v,val;
      };
      vector<edge> graph[N];
      void add_edge(int from,int to,int value) {
          graph[from].push_back((edge){to,value});
      }
      //遍历在C++14后可以写作:
      //for(auto it:graph[i])
      //其中it相当于graph[i][j]
      
    • 排序之后可以log复杂度查边

  • 邻接链表,以链表储存每一个点的所有边,一般用链式前向星写。

    struct Edge{
        int to,val,nxt; //一般不用存边的起点
    }edge[M];//M看数据,未给就是N*N(N为节点数)
    int head[N]; //初始化为-1
    int tot;
    void add_edge(int u, int v, int w)	//添加一条u->v的权为w的边
    {
    	++tot;
    	edge[tot].to = v;
    	edge[tot].val = w;
        edge[tot].nxt = head[u];
    	head[u] = tot;
    }
    //遍历写作:
    //for(int i=head[x];~i;i=edge[i].nxt)
    

    无向边存邻接表:每条边的序号iii 为偶数,反边存在i+1i+1i+1,利用位运算iii^111 迅速找到反边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值