樹的儲存方式陣列鍊錶 vector

2022-03-06 14:34:16 字數 1672 閱讀 1951

圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在我來介紹另外一種儲存圖的方法:鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2

模板如下:

struct edgeedge[n*3];

int first[n],t;

void init()

t = 0;

memset(first,-1,sizeof(first));

void add(int u,int v,int w)

edge[t].u = u;     //u:第i條邊的起點

edge[t].v = v;     //v:第i條邊的終點

edge[t].w = w;    //w:權值

edge[t].next = first[u];   //next:第i條邊的前一條邊(此煉表上)

first[u] = t++;     //first[i]:頂點i對應的邊

遍歷:反向遍歷一條邊

for(int i = first[u];i!=-1;i = edge[i].next)

bfs遍歷所有節點

for(i = 1;i<=n;i++)

k = first[i];

while(k!=-1)

k = edge[i].next;

dfs遍歷所有節點(略)

具體問題:待續

一、vector 簡介及基本操作:

1、vector是c++中stl庫中封裝好的容器,常用定義不定長陣列來構建無向圖或有向圖.

2、基本操作:

(1)標頭檔案#include.

(2)建立vector物件,vectorvec;

(3)尾部插入數字:vec.push_back(a);

(4)使用下標訪問元素,cout<(5)使用迭代器訪問元素.

vector::iterator it;

for(it=vec.begin();it!=vec.end();it++)

cout<<*it<(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;

(7)刪除元素:    vec.erase(vec.begin()+2);刪除第3個元素

vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始

(8)向量大小:vec.size();

(9)清空:vec.clear();

vector的元素不僅僅可以使int,double,string,還可以是結構體,但是要注意:結構體要定義為全域性的,否則會出錯。

如下例:

struct node ;

vector g[ ];

二、構建圖:

(1) 定義不定長陣列 vector map[100010] ;

(2)    建邊

for(i=1; i < = n ; i + +)

scanf("%d %d",&s,&t);

map[s].push_back(t);

map[t].push_back(s);                //有向圖時,此步省略。

(3)遍歷

for (i=0; i< = map[s].size(); i++)

printf("%d\n",map[s][i]);

資料儲存(鍊錶與陣列)

資料存放在記憶體中,在記憶體中的組織形式只有兩種 衡量乙個演算法是否優越 int a 100 就是在記憶體中申請100個連續的sizeof int 空間 int p int malloc 100xsizeof int 在堆空間中申請100個連續的int空間 對空間進行訪問 得到第10個成員,則a 9...

陣列 鍊錶 樹特性分析

1.陣列需要在記憶體中需要申請連續的記憶體空間。2.陣列可以通過下標的方式進行資料的獲取,所以陣列的查詢效率更快 3.增刪效率差,需要動態的擴容或者更改內容資料的複製 1.記憶體空間靈活,不需要連續的空間。2.增刪效率高只需要修改相連的兩個節點的位址即可 3.查詢效率低,不支援下標的訪問方式,支援順...

二叉樹儲存方式 二叉鍊錶

二叉樹一般有兩種儲存方式 1 陣列方式 2 鍊錶方式 1 陣列儲存方式 上面兩個二叉樹對應的鍊錶儲存為 我們採用層序遍歷的方式將二叉樹各個節點進行編號 這裡的編號我們是把二叉樹均看成滿二叉樹進行編號的,這樣編號的好處是方便我們根據編號輕鬆定位節點位置 並將節點資料存放在對應編號下。我們可以看出對於滿...