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...  
    }
  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/orion7/p/7729334.html
Copyright © 2011-2022 走看看