zoukankan      html  css  js  c++  java
  • 关于图的邻接表的表示方法

    本文转载自:http://yzmduncan.iteye.com/blog/883903
    数据结构中表示邻接表的一般方法

    typedef struct Node  
    {  
        int dest;                   //邻接边的弧头结点序号  
        int weight;                 //权值信息  
        struct Node *next;          //指向下一条邻接边  
    }Edge;                          //单链表结点的结构体  	  
    typedef struct  
    {  
        DataType data;              //结点的一些数据,比如名字  
        int sorce;                  //邻接边的弧尾结点序号  
        Edge *adj;                  //邻接边头指针  
    }AdjHeight;                     //数组的数据元素类型的结构体  	  
    typedef struct  
    {  
        AdjHeight a[MaxVertices];   //邻接表数组  
        int numOfVerts;             //结点个数  
        int numOfEdges;             //边个数  
    }AdjGraph;                      //邻接表结构体  
    

    其实有种简洁且高效的表示形式:

    typedef struct  
    {  
        int to;  
        int w;  
        int next;  
    }Edge;  
    Edge e[MAX];  
    int pre[MAX];  	  
    //初始化  
    memset(pre,-1,sizeof(pre));  	  
    //输入  
    scanf("%d %d %d",&from,&to,&w1);  
    e[i].to = to; e[i].w = w1; e[i].next = pre[from]; pre[from] = i;  
    i++;  
    

    上面这段代码中,边的结构体Edge由三个元素组成:弧头结点序号,边权值,下一条边的序号。e[i]指的是第i条边。pre[i]记录的是从当前输入的情况来看,序号为i的弧尾结点发出的第一条边的序号是pre[i]。
    这样,在操作某个结点发出的边时,可以像这么做:

    	/*now为弧尾结点序号,i为now所发出的边序号,adj为弧头结点序号,w为now-->adj这条边的权值*/  
    for(i = pre[now]; i != -1; i = edge[i].next)  
    {  
         int adj = edge[i].to;  
         int w = edge[i].w;  
         //do something...  
    }
  • 相关阅读:
    yanghui杨辉三角--(一维数组
    yanghui杨辉三角--(一维数组)探索1 2
    yanghui杨辉三角--(二维数组
    Fiber VS Coroutine VS Green Thread
    Java8-Reference
    Boolean
    Java-相等
    java.lang.Cloneable
    java.lang.CharSequence
    java.lang.AutoCloseable
  • 原文地址:https://www.cnblogs.com/orion7/p/7729334.html
Copyright © 2011-2022 走看看