代码改变世界

邻接表的几种表示法

2014-07-15 11:00  gongti  阅读(345)  评论(0编辑  收藏  举报
  1. /*
    *第一种形式,这里也可以不使用struct结构体
    */
    int head[maxn],next[maxm]
    struct Edeg{
        int from,to,dist;
    }edegs[maxm];
    int edgenum;
    
    void addedge(int u,int v,int d)
    {
        p[edgenum]={u,v,dist};
        next[edgenum]=first[u];
        first[u]=edgenum++;
    }
    
    对于节点x的遍历:
    for(int i=head[x];i!=-1;i=next[i])
    {
        //i是边序号
    }
    
    
    /*
    *第二种形式
    */
    
    int head[maxn];
    struct Edge{
        int from,to,dist;
        int next;
    }edges[maxm];
    int edgenum;
    
    void addedge(int u,int v,int d)
    {
        edges[edgenum]={u,v,d,first[u]};
        head[edgenum]=edgenum++;
    }
    
    对于节点x的遍历:
    for(int i=head[x];i!=-1;i=edges[i].next)
    {
        //i是边序号
    }
    
    
    
    /*
    *第三中形式
    */
    struct Edge{
        int from,to,dist;
    };
    vector<Edge> edges;
    vector<int> G[maxn];
    
    void addedge(int u,int v,int d)
    {
        edges.push_back(Edge{u,v,d});
        m=edges.size();
        G[u].push_back(m-1);
    }
    
    对于节点x的遍历:
    for(int i=0;i<G[x].size;i++)
    {
        //G[x][i]是边序号
        Edge& e=edegs[G[x][i]];
        .....
    }