关于图的邻接表的表示方法

本文转载自: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...  
}
posted @ 2017-10-25 15:56  Zireael  阅读(593)  评论(1编辑  收藏  举报