码迷,mamicode.com
首页 > 其他好文 > 详细

图的存储

时间:2018-08-27 21:30:04      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:col   color   tree   注意   个数   邻接矩阵   ...   bsp   const   

方法一:邻接矩阵

简单明了,但存储稀疏图时空间浪费过多。

方法二:vector

为每一个结点开一个链表,储存与之相邻的结点。链表用vector动态数组实现。

 1 const int maxn=1e5+5;
 2 vector<int> tree[maxn];
 3 inline void add(int u,int v)
 4 {
 5     tree[u].push_back(v);
 6 }
 7 void dfs(int p,int i)
 8 {
 9     //...
10     for(int j=0;j<tree[i].size();++j)
11     {
12         if(tree[i][j]==p)continue;
13         dfs(i,tree[i][j]);
14     }
15 }

方法三:邻接表

为每一个结点开一个链表,储存与之相邻的边。链表由数组实现。假设一个图共有n个结点和m条边,则建立数组head[1-n]记录编号为i的结点对应的链表的头一个元素,数组next[1-m]记录编号为j的边在链表中的下一个元素。注意还需要一个数组保存输入数据,要解决这两个问题,只需要注意到每个结点对应链表里存储的边可以由边的另一个端点表示,并且这种表示法天生就具有方向性。于是可以开一个q数组记录输入数据。

 1 const int maxn=1e2+5;
 2 const int maxm=1e4+5;
 3 int q[2*maxm],head[maxn],nxt[maxm];//next是保留字,这里用nxt
 4 int pos=0;
 5 inline void add(int u,int v)
 6 {
 7     q[++pos]=u;
 8     nxt[v]=head[u];
 9     head[u]=pos;
10 }
11 void dfs(int p,int i)
12 {
13     //...
14     for(int j=head[i];j;j=next[j])
15     {
16         if(q[j]==p)continue;
17         dfs(i,q[j]);
18     }
19 }

 

--未完待续--

图的存储

标签:col   color   tree   注意   个数   邻接矩阵   ...   bsp   const   

原文地址:https://www.cnblogs.com/maoruimas/p/9544151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!