圖的鄰接矩陣儲存法,它的空間和時間複雜度都是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 陣列儲存方式 上面兩個二叉樹對應的鍊錶儲存為 我們採用層序遍歷的方式將二叉樹各個節點進行編號 這裡的編號我們是把二叉樹均看成滿二叉樹進行編號的,這樣編號的好處是方便我們根據編號輕鬆定位節點位置 並將節點資料存放在對應編號下。我們可以看出對於滿...