一般采用两种方式表示图:邻接矩阵和邻接表
一、邻接矩阵是表示图的数据结构中最常用也是最简单的一种,对于一个有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);