图的表示方式

一般采用两种方式表示图:邻接矩阵和邻接表

一、邻接矩阵是表示图的数据结构中最常用也是最简单的一种,对于一个有n个点的图需要一个n*n的矩阵称之为map,假设存在边<vi,vj>并且它的权值为w,则:map[vi][vj]=w;

邻接矩阵需要初始化,map[vi][vi]=0    map[vi][vj]=INF(无穷大)   (vi !=vj).

对于邻接矩阵,初始化需要O(n^2)的时间,空间上的开销也是O(n^2)

邻接矩阵的优点是简单直观,并且可以直接查询点 vi 到 vj 间是否有边。缺点是,遍历效率较低,初始化效率低,大图的开销特别大,对于稀疏图邻接矩阵的空间利用率也不高,大度位置为INF。

二、邻接表是图的一种链式存储结构,对于G中的每个顶点vi,把所有邻接于vi的顶点vj连成一个单链表,这个单链表称为顶点vi的邻接表。

邻接表有3种实现方法:动态建表,使用vector 模拟链表实现,和静态建表这里只介绍前两种

struct EdgeNode{                     //邻接表节点
      int to  ;                             //终点
      int w   ;                            //权值
      EdgeNode * next ;            //指向下一条边的指针
};

struct VNode{                     //起点表节点
          int from;                    //起点
          EdgeNode  * first;      //  邻接表头指针
}

VNode Adjlist[maxn];
    cin>>i>>j>>w;
    EdgeNode  * p=new EdgeNode();
    p->to=j;
    p->w=w;
    p->next=Adjlist[i].first;
   Adjlist[i].first=p;

 2)用vector 实现

struct EdgeNode{                     //邻接表节点
      int to  ;                             //终点
      int w   ;                            //权值
  
};

vector<EdgeNode> map[maxn];


EdgeNode  e;
cin>>i>>j>>w;
e.to=j;
e.w=w;
map[i].push_back(e);
原文地址:https://www.cnblogs.com/wintersong/p/5036635.html